-程序将数字(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);
在评论后进行编辑:
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 :(得分:0)
我应该从0开始,而不是-1。
您还没有注意到它,但是您的数学错误是数字0到9。
如果您希望所有输出都为16个十六进制字符为正,则需要一个无符号的64位整数(但是,这是在您的平台/编译器上实现的),并且需要打印长的无符号(即,不是%i /%d)。