- yuxitong's blog
高精度全家桶!!!
- 2024-3-6 17:01:52 @
一、高精度加法
注:所有代码均为远古代码。
//顶级垃圾程序
//A very bad program
#include <bits/stdc++.h>
using namespace std;
#define maxsize 1000
char ac1[maxsize + 1], ac2[maxsize + 1];
int an1[maxsize + 1], an2[maxsize + 1], asn[maxsize + 1];
int main() {
//define
memset(ac1, 0, sizeof(ac1));
memset(ac2, 0, sizeof(ac2));
memset(an1, 0, sizeof(an1));
memset(an2, 0, sizeof(an2));
memset(asn, 0, sizeof(asn));
//input
cin >> ac1;
cin >> ac2;
//process
//处理加数为0的情况
if (ac1[0] == '0' && ac2[0] == '0') {
cout << '0' << endl;
} else if (ac1[0] == '0') {
cout << ac2 << endl;
} else if (ac2[0] == '0') {
cout << ac1 << endl;
} else {
//计算输入字符的有效长度
int lenaddchar1 = strlen(ac1);
int lenaddchar2 = strlen(ac2);
//倒序转入整形数组,以便于进位
for (int i = 0; i < lenaddchar1; ++i) {
an1[lenaddchar1 - i - 1] = int(ac1[i] - '0');
}
for (int i = 0; i < lenaddchar2; ++i) {
an2[lenaddchar2 - i - 1] = int (ac2[i]-'0');
}
//取得输入字符串的最大长度
int lenmax = max(lenaddchar1,lenaddchar2);
//按位相加
for(int i = 0; i < lenmax; ++i){
//和的逐位相加不要忘,累加前面的进位
asn[i] += an1[i] + an2[i];
//进位计算
if(asn[i] >= 10){
asn[i + 1]++; //加法最多进一位
asn[i] -= 10;
}
}
//若没有进位,删除前导多余的0
//有效的数字区间[0, lenmax - 1], asn[lenmax]是最高位的进位数字
if(asn[lenmax] == 0){
lenmax--;
}
//output
//倒序输出和的值
for(int i = lenmax; i >= 0; i--){
cout << asn[i];
}
}
return 0;
}