107 16进制加法
问题描述 :
某天、小晨在路上背着单词,突遇一外星人,外星人对小晨很感兴趣,为了考验小晨的智商,就向小晨提问简单加法,由于外星人使用16进制,所以,小晨必须用16进制回答。
输入说明 :
首先输入一个整数T,
以下T行,每行两个16进制数字
输出说明 :
T行,每行一个16进制数,为求出的两数之和。
其中的英文字母a到f为小写。
输入范例 :
2
4b0d 4887
2745 7438
输出范例 :
9394
9b7d
思想:和上题一样,改一下进位判断条件和处理a-f和0-9的asc码的方法即可。
#include <stdio.h> #include <string.h> int main() { int num, i, j, k; scanf("%d", &num); for (k = 0; k < num; k++) { char n[4000]; char num1[2000]; int count1 = 0; char num2[2000]; int count2 = 0; char res[3000]; int count3 = 0; if(k==0){ getchar(); //首行输入 吸收一下回车 } gets(n); int flag = 0; //进位标志 for (i = 0; i < strlen(n); i++) //第一个数字 { if (n[i] != ' ') { num1[count1++] = n[i]; } else { i++; break; } } for (; i < strlen(n); i++) //第二个数字 { if(n[i]==' '){ // oj给的最后一个算例 调了一个小时没找到问题在哪 原来是它输入不规范 第二个数后面有空格 给它特殊处理一下 break; } num2[count2++] = n[i]; if(n[i]==' '){ break; } } count1--; //count指向了后一个数 所以还原一下 count2--; while (count1>=0 && count2>=0) //进行加法 { int a ,b; if(num1[count1]>='a'&&num1[count1]<='f'){ a = num1[count1] - 87; count1--; }else{ a = num1[count1] - '0'; count1--; } if(num2[count2]>='a'&&num2[count2]<='f'){ b = num2[count2] - 87; count2--; }else{ b = num2[count2] - '0'; count2--; } int temp = a + b + flag; flag = 0; if (temp >= 16) { flag = temp/16; temp %= 16; } if(temp>=10&&temp<16){ temp = temp+87; }else{ temp = temp+'0'; } res[count3++] = temp; } if (count1==-1 && count2==-1 && flag) //如果两个数都加完了,还往前进一位的情况 { res[count3++] = flag+'0'; } else { while (count1>=0) //1数的高位 累加进位处理 { int temp; if(num1[count1]>='a'&&num1[count1]<='f'){ temp = num1[count1--] - 87 + flag; }else{ temp = num1[count1--] - '0' + flag; } flag = 0; if (temp >= 16) { flag = temp/16; temp %= 16; } if (temp>=10&&temp<16){ temp = temp +87; }else{ temp = temp +'0'; } res[count3++] = temp; } while (count2>=0) //2数的高位 累加进位处理 { int temp; if(num2[count2]>='a'&&num2[count2]<='f'){ temp = num2[count2--] - 87 + flag; }else{ temp = num2[count2--] - '0' + flag; } flag = 0; if (temp >= 16) { flag = temp/16; temp %= 16; } if (temp>=10&&temp<16){ temp = temp +87; }else{ temp = temp +'0'; } res[count3++] = temp; } } for (i = count3-1; i >=0; i--) { printf("%c", res[i]); } printf("\n"); } }

浙公网安备 33010602011771号