2017-12-01 18 views
0
bool testMagicSquare(string str) { 
    int length, sum = 0; 
    length = strlen(str); 

    for (int i = 0; i < length; i++) { 
    sum = sum + str[i]; 
    } 
    if (sum == 120) { 
    return 1; 
    } 

    else return 0; 
} 

내 과제는 텍스트 파일에서 16 진수 스퀘어를 가져와 "Magic Square"인지 테스트합니다. 그렇다면 사각형을 다른 텍스트 파일에 인쇄하여 저장하십시오. 텍스트 파일 가져 오기 및 파일 인쇄가 작동하지만 테스트가 붙어 있습니다.텍스트 파일에서 16 진수 문자열을 테스트하는 방법은 무엇입니까?

아이디어가 있으십니까? 16 진수 문자열의

예 8 5 3 4 F 9 2 예 0-7 B C D 6 1

+0

제곱이 한자리 숫자로 된 HEX 숫자를 기반으로하는 경우 코드에서 수행하는 것처럼 ASCII 값을 합계 할 수 있습니다! 마법의 광장인지 확인하려면 https://stackoverflow.com/questions/47555212/check-if-my-matrix-is-magic-square/47557532#47557532를 참조하십시오. 이 코드는 10 진수를 나타내지 만 숫자가 마술 사각형을 나타내는 지 확인하는 방법을 알려줍니다. –

+0

마법의 유일한 조건은 120의 합입니까? –

+0

16 진수'char' 또는'str [i]'를 "0-9a-fA-F"로 변환합니다. – chux

답변

0

이 코드를보십시오. 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; 
}