题意
就是求16进制的加法
思路
纯模拟,过了后发现可以用%x,直接输入输出。
首先将16进制转成10进制,再将10进制转成16进制。有个问题就是题目说输入不超过15位,但是 F F F F F F F F F F F F F F 16 FFFFFFFFFFFFFF_{16} FFFFFFFFFFFFFF16 = 7205759403792794 0 10 72057594037927940_{10} 7205759403792794010显然爆int。
发现
以前做题没有怎么用C写过HDU的题。
第一,多组输入注意清空字符数组,令每个字符等于’\0’即可。
第二,使用abs函数时注意,当数爆int时,用long long 储存使用abs会有误。
第三,模拟时记得用long long。
#include<stdio.h>
#include<string.h>
#include<math.h>
int Transform1(char c){
if(c == '0') return 0;
else if(c == '1') return 1;
else if(c == '2') return 2;
else if(c == '3') return 3;
else if(c == '4') return 4;
else if(c == '5') return 5;
else if(c == '6') return 6;
else if(c == '7') return 7;
else if(c == '8') return 8;
else if(c == '9') return 9;
else if(c == 'A') return 10;
else if(c == 'B') return 11;
else if(c == 'C') return 12;
else if(c == 'D') return 13;
else if(c == 'E') return 14;
else return 15;
return ;
}
char Transform2(int c){
if(c == 0) return '0';
else if(c == 1) return '1';
else if(c == 2) return '2';
else if(c == 3) return '3';
else if(c == 4) return '4';
else if(c == 5) return '5';
else if(c == 6) return '6';
else if(c == 7) return '7';
else if(c == 8) return '8';
else if(c == 9) return '9';
else if(c == 10) return 'A';
else if(c == 11) return 'B';
else if(c == 12) return 'C';
else if(c == 13) return 'D';
else if(c == 14) return 'E';
else return 'F';
}
long long SixteenToTen(char *s){
int length = strlen(s), i, j;
int f = 0;
long long ans = 0;
for(i = 0; i < length; i ++){
if(i == 0){
if(s[i] == '+') {
f = 1;
continue;
}
if(s[i] == '-'){
f = 2;
continue;
}
}
int temp = Transform1(s[i]);
long long ans1 = 1;
for(j = 1; j <= length-1-i; j ++){
ans1 = ans1 * 16;
}
ans += temp*ans1;
}
if(f == 2) ans *= -1;
return ans;
}
int main(){
char s[10000];
int i, j;
while(gets(s)){
char s1[100], s2[100];
int x = 0, length = strlen(s);
for(i = 0; i < length; i ++){
s1[i] = '\0';
s2[i] = '\0';
}
for(i = 0; i < length; i ++)
{
if(s[i] == ' ') {
x = i+1;
break;
}
s1[i] = s[i];
}
for(i = x, j = 0; i < length; i ++, j ++) s2[j] = s[i];
int length1 = strlen(s1), length2 = strlen(s2);
long long ans1 = 0, ans2 = 0;
ans1 = SixteenToTen(s1);
ans2 = SixteenToTen(s2);
int len = 0;
long long ans = ans1 + ans2;
int flag = 0;
if(ans < 0) {
flag = 1;
ans = ans * -1;
}
if(ans == 0){
printf("0\n");
continue;
}
char finalAns[100];
while(ans != 0){
finalAns[len++] = Transform2(ans % 16);
ans = ans / 16;
}
if(flag == 1) printf("-");
for(i = len -1 ;i >= 0; i--){
printf("%c", finalAns[i]);
}
printf("\n");
}
return 0;
}