题解 100% AC
2025-08-25 20:49:16
发布于:江苏
7阅读
0回复
0点赞
含带缩进不带注释代码
#include <bits/stdc++.h>
using namespace std;
// 全局数组用于存储数字和结果
int a[10010], b[10010], c[10010];
// 将字符转换为对应的数值
int to_val(char x) {
// 如果是数字字符,直接转换为数值
if(isdigit(x)) return x - '0';
// 如果是字母字符,转换为对应数值(A=10,B=11,...)
return toupper(x) - 'A' + 10;
}
// 将数值转换为对应的字符
char to_char(int x) {
// 数值小于10转换为数字字符
if(x < 10) return x + '0';
// 数值大于等于10转换为字母字符
return x + 'A' - 10;
}
int main() {
int k; // 进制数B
cin >> k;
string as, bs; // 两个B进制数
cin >> as >> bs;
// 反转字符串,方便从低位开始计算
reverse(as.begin(), as.end());
reverse(bs.begin(), bs.end());
// 存储数字长度
a[0] = as.size(); // a[0]存储第一个数的位数
b[0] = bs.size(); // b[0]存储第二个数的位数
c[0] = max(a[0], b[0]); // 结果位数初始设为较大的位数
// 将字符转换为数值存入数组
for(int i = 0; i < as.length(); i++)
a[i+1] = to_val(as[i]);
for(int i = 0; i < bs.length(); i++)
b[i+1] = to_val(bs[i]);
// 逐位相加
for(int i = 1; i <= c[0]; i++) {
// 计算当前位的和(包括进位)
int sum = a[i] + b[i] + c[i];
// 计算进位
c[i+1] = sum / k;
// 计算当前位的值
c[i] = sum % k;
}
// 处理最高位的进位
if(c[c[0]+1] > 0) c[0]++;
// 去除前导零
while(c[c[0]] == 0 && c[0] > 1)
c[0]--;
// 输出结果
for(int i = c[0]; i >= 1; i--)
cout << to_char(c[i]);
return 0;
}
算法说明
-
输入处理:
- 读取进制数B和两个B进制字符串
- 将字符串反转以便从最低位开始计算
-
字符转换:
to_val()
函数处理数字字符和字母字符到数值的转换to_char()
函数实现数值到字符的逆向转换
-
加法运算:
- 使用数组存储各位数值
- 逐位相加并处理进位
- 每位结果不超过B-1,进位保存到下一位
-
结果处理:
- 处理最高位的进位情况
- 去除结果中的前导零
- 将结果反转回正常顺序输出
示例解析
以样例输入为例:
4 // 4进制
123
321
处理过程:
- 反转输入:"321" → "123","123" → "321"
- 逐位相加:
- 个位:1+3=4 → 4/4=1进位,4%4=0
- 十位:2+2+1(进位)=5 → 5/4=1进位,5%4=1
- 百位:3+1+1(进位)=5 → 5/4=1进位,5%4=1
- 千位:0+0+1(进位)=1
- 结果:"1110"(4进制)
该实现能正确处理2-36进制的大数加法,时间复杂度为O(n),适用于2000位以内的数字运算。
带缩进不带注释代码
#include <bits/stdc++.h>
using namespace std;
int a[10010],b[10010],c[10010];
int to_val(char x){
if(isdigit(x))return x-'0';
return toupper(x)-'A'+10;
}
char to_char(int x){
if(x<10)return x+'0';
return x+'A'-10;
}
int main(){
int k;
cin>>k;
string as,bs;
cin>>as>>bs;
reverse(as.begin(),as.end()),reverse(bs.begin(),bs.end());
a[0]=as.size(),b[0]=bs.size(),c[0]=max(a[0],b[0]);;
for(int i=0;i<as.length();i++)a[i+1]=to_val(as[i]);
for(int i=0;i<bs.length();i++)b[i+1]=to_val(bs[i]);
for(int i=1;i<=c[0];i++){
c[i+1]=(a[i]+b[i]+c[i])/k;
c[i]=(a[i]+b[i]+c[i])%k;
}
if(c[c[0]+1]>0)c[0]++;
while(c[c[0]]==0&&c[0]>1)c[0]--;
for(int i=c[0];i>=1;i--)cout<<to_char(c[i]);
return 0;
}
这里空空如也
有帮助,赞一个