-程序将数字(16)的值作为一个字符串char(0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F)

-根据字符表将代码转换为正确的值

-将值转换为十进制



但是...如果:

在:A |出:10(+)

在:AA |出:170(+)

在:AAA |出:...忘记答案但是(+)

!!!在:AAAA |输出:错误(-)

为什么?

#include <STDIO.H>
#include <CONIO.H>
void main()
{
    char m[100];                                // init massive chars [m]
    gets(m);                                    // input massive [m] (16 digit number)
    int i = -1;                                 // init counter for [m] (-1 for start [i++] in 0 pos)

    while (m[i++]);                             // go to last postion in [m] and count length
    i--;                                        // step back for skip '\0'
    i--;                                        // step back for start position last char
    int s = 0;                                  // init sum  number (10 digit number)
    int v = 1;                                  // init multiplier

    while (i >= 0)                              // it is first char?
    {
        if ((m[i] >= 'A') && (m[i] <= 'F')) s += ((int)(m[i]-55) * v); // if char 'A'(65) char = (10)  * multiplier
        else s += ((int)(m[i]) * v);                                // else char 1,2,3,4,5... (1,2,)* multiplier
        v *= 16;                                // up multiplier power
        i--;                                    // char step back
    }
    printf("%i", s);                            //out sum
}


经过评论后编辑:

char m[100];
gets(m);
int i = 0;       // * "=-1" -> "0"
while (m[++i]);  // * "i++" -> "++i"
i--;

double s = 0; int v = 1;
while (i >= 0)
{
  if ((m[i] >= 'A') && (m[i] <= 'F'))  s += ((int)(m[i]-55) * v);
  if ((m[i] >= '0') && (m[i] <= '9'))  s += ((int)(m[i]-48) * v); //add this rules

  v *= 16;
  i--;
}

printf("%lf", s);


+带有输出结果的图像
12

经过评论后编辑:

char m[100];
gets(m);
for (int i = 0; m[i] != '\0'; i += 1); // *

unsigned long int s = 0; unsigned long int v = 1;    // *
for (int u = 0; u < i; u += 1)
{
  if ((m[u] >= 'A') && (m[u] <= 'F'))  s += ((int)(m[u]-55) * v);
  if ((m[u] >= '0') && (m[u] <= '9'))  s += ((int)(m[u]-48) * v);

  v *= 16;
}

printf("%lu", s);                      // *

最佳答案

我应该从0开始,而不是-1。

您尚未注意到它,但是您的数学错误是数字0到9。

如果您期望所有输出都为16个十六进制字符为正,则需要一个无符号的64位整数(但是,这是在您的平台/编译器上实现的),并且需要打印无符号的long(即不是%i /%d)。

07-24 09:36
查看更多