加法
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
char numStr1[1000], numStr2[1000];
int num1[1000], num2[1000], ans[1000], str1Len, str2Len, ansLen;
int main() {
cin >> numStr1 >> numStr2;
str1Len = strlen(numStr1);
str2Len = strlen(numStr2);
// 顺序翻转
for (int i = 0; i < str1Len; i++) num1[str1Len - i - 1] = numStr1[i] - '0';
for (int i = 0; i < str2Len; i++) num2[str2Len - i - 1] = numStr2[i] - '0';
int upNum = 0; // 进位
for (int i = 0;; i++) {
if (i >= max(str1Len, str2Len) && upNum == 0)break;
int sum = num1[i] + num2[i] + upNum;
upNum = sum / 10;
ans[i] = sum % 10;
ansLen = i;
}
// 去掉高位的0
for (int i = ansLen; i > 0; i--) {
if (ans[i] == 0) ansLen--;
else break;
}
// 反向输出
for (int i = ansLen; i >= 0; i--) {
cout << ans[i];
}
return 0;
}
测试题目:P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
乘法
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
char numStr1[5000], numStr2[5000];
int num1[5000], num2[5000], ans[10000], str1Len, str2Len, ansLen;
int main() {
cin >> numStr1 >> numStr2;
str1Len = strlen(numStr1);
str2Len = strlen(numStr2);
// 顺序翻转
for (int i = 0; i < str1Len; i++) num1[str1Len - i - 1] = numStr1[i] - '0';
for (int i = 0; i < str2Len; i++) num2[str2Len - i - 1] = numStr2[i] - '0';
// 乘法
for (int i = 0; i < str1Len; i++) {
int upNum = 0; // 进位
for (int j = 0; ; j++) {
if (j >= str2Len && upNum == 0) break;
int sum = ans[i + j] + upNum + num1[i] * num2[j];
upNum = sum / 10;
ans[i + j] = sum % 10;
}
}
// 两个数相乘,乘积位数'最多'是两个数位数相加
ansLen = str1Len + str2Len;
// 去掉高位的0
while (ans[ansLen] == 0 && ansLen > 0) {
ansLen--;
}
// 反向输出
for (int i = ansLen; i >= 0; i--) {
cout << ans[i];
}
return 0;
}