HDU1720(十六进制加法)(×)

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值