例题
分析
输入
本题解题关键在于输入的两个数位数不同时候需要尾数对齐,由于是16进制输入,含有字母,需要当作字符串输入,当然输出也要字母,那么就需要我们的两个老伙计了,一个是map,另一个是自己定义char和int互转的函数,map有点麻烦,我们这里还是用自定义函数。
个位对齐
- 将输入的char数组转换成string,从而能够很容易的求出数组的长度
- 对比两个字符串的长度,取小的那个长度作为接下来循环相加所得子串target的长度
- 循环相加时候每个字符数组都从各自length-1的位置开始取数
循环相加
- 经过个位对齐,取完字符后,将两数字符转成相应数字
- 两个数字相加,所得之和对16取余
- 取余结果转换成字符不断拼入一个字符串target中
- 每次完成依次上述三个操作,就将当前位置为’\0’,然后再赋给string以便下一轮while计算长度(这一步的目的是让字符串长度都减去1)
- 重复上述4个操作,直到其中一个数组长度为0
输出结果
- 先找出上面两个字符数组中非空的一个输出(这个数组是正序的,且是高位,应该先输出)
- 再倒序输出target串(这个串是低位,倒序,需要后输出)
代码来咯
#include <cstdio>
#include <map>
#include <string>
#include <cmath>
#include <vector>
#include <algorithm>
#include <stack>
using namespace std;
int real_num(char num){
if(num<='9'&&num>='0'){
return num-'0';
}else if(num<='f'&&num>='a'){
return num-'a'+10;
}else if(num<='F'&&num>='A'){
return num-'A'+10;
}
return -1;
}
int real_char(int num){
if(num<=9){
return num+'0';
}else{
return num-10+'A';
}
}
int main(){
char num_1[1000];
char num_2[1000];
while(scanf("%s%s",num_1,num_2)!=EOF){
string n_1 = num_1;
string n_2 = num_2;
string target = "";
int m_length = min(n_1.length(),n_2.length());
while(n_1.length()>0&&n_2.length()>0){
int n1 = real_num(num_1[n_1.length()-1]);
int n2 = real_num(num_2[n_2.length()-1]);
num_1[n_1.length()-1] = '\0';
num_2[n_2.length()-1] = '\0';
target += real_char((n1+n2)%16);
n_1 = num_1;
n_2 = num_2;
}
if(n_1.length()>0){
printf("%s",n_1.c_str());
}
if(n_2.length()>0){
printf("%s",n_2.c_str());
}
for(int i=m_length-1;i>=0;i--){
printf("%c",target[i]);
}
printf("\n");
}
return 0;
}