【问题标题】:How to test hexadecimal string from textfile?如何从文本文件中测试十六进制字符串?
【发布时间】:2017-12-01 15:56:14
【问题描述】:
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;
}

我的任务是从文本文件中获取一个十六进制正方形,测试它是否是“魔术正方形”。如果是,请在另一个文本文件中打印正方形以保存它。 获取文本文件并打印到文件正在工作,但我坚持测试。

有什么想法吗?

十六进制字符串示例:8 3 4 f 5 e 9 2 b 0 7 c 6 d a 1

【问题讨论】:

  • 如果正方形是基于一个数字的十六进制数字,您可以像在代码中那样对 ASCII 值求和!要验证是否是幻方,您可以参考 stackoverflow.com/questions/47555212/… 。此代码用于十进制数字,但会指示您如何验证数字是否代表幻方。
  • 神奇的唯一条件是120的总和?
  • 将十六进制的charstr[i] 转换为“0-9a-fA-F”的值。 int val = strtol((char []){str[i], '\0'}, NULL, 16);
  • 或者保留为 ASCII 并使用 if (length == 16 &amp;&amp; sum == '0'+'1'+... + 'f')。不过,后一种方法可能会被愚弄
  • 总是 4x4 的“魔方”?

标签: c matrix hex


【解决方案1】:

试试这个代码。它仅适用于一位 HEX 数字!

#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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-02-04
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 2018-02-02
    • 2013-12-20
    相关资源
    最近更新 更多