正经题解|16进制加法
2024-07-29 11:29:11
发布于:浙江
69阅读
0回复
0点赞
解法一
这题有个很简单的办法,scanf
是可以直接读入 16进制
的数字的,你可以使用占位符 %X
,同样你可以使用 printf
进行格式化输出
AC代码
#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
int main() {
long long a,b;
scanf("%x %x",&a,&b);
printf("0X%X",a+b);
return 0;
}
解法二
如果你之前不知道解法一这种东西,你大概率是用字符串模拟做的,当然我们需要掌握模拟的做法。
我们从低位开始相加,逢 进 即可,中间只要注意字符转数字以及数字转字符即可。
AC代码
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
//将字符转为数字
int getNumber(char x) {
if (x >= '0' && x <= '9')return (x - '0');
return x - 'A' + 10;
}
string add(string a,string b) {
//始终让字符串b的长度更长
if (a.length() > b.length())return add(b,a);
//反转两个字符串,便于从低位相加
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
string ans = "";
int t = 0;
//便利时排除0X字符,所以要-2
for(int i=0;i<b.length()-2;i++) {
t += getNumber(b[i]);
if (i < a.length() - 2) {
t += getNumber(a[i]);
}
int x = t % 16;
if (x >= 0 && x <= 9) {
ans += char(x + '0');
}else {
ans += char(x - 10 + 'A');
}
t /= 16;
}
while(t) {
int x = t % 16;
if (x >= 0 && x <= 9) {
ans += char(x + '0');
}else {
ans += char(x - 10 + 'A');
}
t /= 16;
}
//将答案反转
reverse(ans.begin(),ans.end());
return ans;
}
int main() {
string a,b;
cin >> a >> b;
cout << "0X" << add(a,b) << endl;
return 0;
}
全部评论 2
666
2024-08-01 来自 广东
0坏了,我用的是原始人做法(
2024-07-29 来自 湖南
0小丑加1
2024-07-29 来自 浙江
0🤡
2024-07-29 来自 湖南
0🤡
2024-07-29 来自 浙江
0
有帮助,赞一个