HDU1720(A+B Coming)
本题目为求十六进制加法。
一般正常想法为先将十六进制转换为十进制数然后再相加。
但是因为计算机可以识别十六进制,从而有如下的简便方法。
一、简便方法(利用%x为十六进制表示)
#include <stdio.h>
int main(void)
{
int a, b;
while(scanf("%x%x", &a, &b) != EOF) {
printf("%d\n", a + b);
}
return 0;
}
二、正常想法
1.此题独特之处在于并不是如题目中所给的样例所示输入的十六进制数只有一位,导致我多次提交出现WA。
所以采用字符串存储输入的两个十六进制数。利用strlen()函数【头文件为string.h】求取数的位数,然后再进行转换。转换中利用了pow()函数【头文件为math.h】求各个未的16的幂。
2.scanf函数读取字符和字符串的注意事项:
(1)给字符数组赋值时可以直接赋值,不需要使用循环。此外从键盘输入后,系统会自动在最后添加结束标志符 ‘\0’。
(2)系统将空格作为输入字符串之间的分隔符。只要一“敲”空格,系统就认为当前的字符串已经结束,接下来输入的是下一个字符串。
(3)用 scanf 输入时,不管输入什么,最后“敲”的回车都会被留在缓冲区。输入字符串时最后“敲”的回车也会被留在缓冲区,如果紧接着要给一个字符变量赋值的话,那么还没等你输入系统就自动退出来了。因为系统自动将回车产生的字符 ‘\n’ 赋给该字符变量了,所以此时对字符变量赋值前要首先清空缓冲区。
3.代码如下所示:
#include <stdio.h>
#include <string.h>
#include <math.h>
int main()
{
char ha[100], hb[100];
int da, db, la, lb, i;
while(scanf("%s%s", ha, hb) != EOF) {
la = strlen(ha);
lb = strlen(hb);
da = 0;
db = 0;
for(i = 0; i < la; i++) {
if(ha[i] >= 'A' && ha[i] <= 'F') {
da += ((ha[i]-'A')+10)*pow(16, la-i-1);
}
else if(ha[i] >= 'a' && ha[i] <= 'f') {
da += ((ha[i]-'a')+10)*pow(16, la-i-1);
}
else {
da += (ha[i]-'0')*pow(16, la-i-1);
}
}
for(i = 0; i < lb; i++) {
if(hb[i] >= 'A' && hb[i] <= 'F') {
db += ((hb[i]-'A')+10)*pow(16, lb-i-1);
}
else if(hb[i] >= 'a' && hb[i] <= 'f') {
db += ((hb[i]-'a')+10)*pow(16, lb-i-1);
}
else {
db += (hb[i]-'0')*pow(16, lb-i-1);
}
}
printf("%d\n", da+db);
}
return 0;
}