이 코드를보십시오. 1 자리 숫자의 16 진수 만 실행됩니다!
#include <stdio.h>
#include <ctype.h>
#define DIMS 4
#define COLS DIMS
#define ROWS DIMS
int convertChar(unsigned char v);
int checkAndComputeSums(int *s , unsigned char *ms, int dim);
enum STYPE {
SUMROW,
SUMCOL,
SUMDIAG,
//-------------------
SUMCNT
};
unsigned char msqr[COLS][ROWS] = {
{'8','3','4','F'},
{'5','E','9','2'},
{'B','0','7','C'},
{'6','D','A','1'}
};
int sum[DIMS][SUMCNT];
const char * label[SUMCNT] = {
"ROWS","COLS","DIAG"
};
int convertChar(unsigned char v)
{
int x;
x = toupper((int)v);
x -= 48; /* 48 is the ASCII code of the char 0 */
if (x>9) x-=7;
return x;
}
int checkAndComputeSums(int *s , unsigned char *ms, int dim)
{
int i,j,ok=1;
/* The sum are cleared */
for(i=0;i<dim;i++) {
for(j=0;j<SUMCNT;j++) {
s[i*SUMCNT+j] =0;
}
}
for(i=0;i<dim;i++) {
for(j=0;j<dim;j++) {
s[i*SUMCNT+SUMROW]+=convertChar(ms[i*dim+j]);
s[i*SUMCNT+SUMCOL]+=convertChar(ms[j*dim+i]);
if (i==j)
s[SUMDIAG]+=convertChar(ms[i*dim+j]);
if (i==dim - j - 1)
s[SUMDIAG+SUMCNT]+=convertChar(ms[i*dim+j]);
}
if (s[i*SUMCNT+SUMROW]!=s[SUMROW] || s[i*SUMCNT+SUMCOL]!=s[SUMROW])
ok=0;
}
if (s[SUMDIAG]!=s[SUMROW] || s[SUMDIAG+SUMCNT]!=s[SUMROW])
ok=0;
return ok;
}
int main(void)
{
int i,j;
i=checkAndComputeSums(sum[0],msqr[0],DIMS);
printf("The check was %s\n",(!i)?"KO":"OK");
for (j=SUMROW;j<SUMCNT;j++) {
printf("%s: ",label[j]);
for(i=0;i<DIMS-((j==SUMDIAG)?2:0);i++) {
printf("%d ",sum[i][j]);
}
puts("");
}
return 0;
}
제곱이 한자리 숫자로 된 HEX 숫자를 기반으로하는 경우 코드에서 수행하는 것처럼 ASCII 값을 합계 할 수 있습니다! 마법의 광장인지 확인하려면 https://stackoverflow.com/questions/47555212/check-if-my-matrix-is-magic-square/47557532#47557532를 참조하십시오. 이 코드는 10 진수를 나타내지 만 숫자가 마술 사각형을 나타내는 지 확인하는 방법을 알려줍니다. –
마법의 유일한 조건은 120의 합입니까? –
16 진수'char' 또는'str [i]'를 "0-9a-fA-F"로 변환합니다. – chux