例题
分析
输入
本题解题关键在于输入的两个数位数不同时候需要尾数对齐,由于是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;
}