一、高精度加法
//顶级垃圾程序
//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;
}
高精度乘法
//顶级垃圾程序
//A very bad program
#include <bits/stdc++.h>
using namespace std;
string s1, s2;
int a[2100], b[2100], c[5000];
int main(){
//输入两个整数
cin >> s1 >> s2;
int la = s1.size(), lb = s2.size();
//反转两个数
for (int i = 0; i < la; i++){
a[i] = s1[la - 1 - i] - '0';
}
for (int i = 0; i < lb; i++){
b[i] = s2[lb - 1 - i] - '0';
}
//进行相乘
for (int i = 0; i < la; i++){
for (int j = 0 ;j < lb; j++){
c[i + j] += a[i] * b[j];
}
}
//处理进位
int lc = la + lb;
for (int i = 0; i < lc; i++){
c[i + 1] += c[i] / 10;
c[i] %= 10;
}
//去除前导零
while (lc > 0 && c[lc] == 0) lc--;
//输出
for (int i = lc; i >= 0; i--){
cout << c[i];
}
return 0;
}
高精度减法
//顶级垃圾程序
//A very bad program
#include <bits/stdc++.h>
using namespace std;
string s1, s2;
int a[1005], b[1005], c[1005], lena, lenb;
int main(){
//输入两个数
cin >> s1 >> s2;
lena = s1.size();
lenb = s2.size();
//a比b小?
if ((lena < lenb) || (lena == lenb && s1 < s2)){
//交换
swap(s1, s2);
swap(lena, lenb);
cout << "-";
}
//反转两个数
for (int i = 0; i < lena; i++){
a[i] = s1[lena - 1 - i] - '0';
}
for (int i = 0; i < lenb; i++){
b[i] = s2[lenb - 1 - i] - '0';
}
//减法
for (int i = 0; i < lena; i++){
//借位
if (a[i] < b[i]){
a[i + 1]--;
a[i] += 10;
}
c[i] = a[i] - b[i];
}
//去除前导零
while (lena > 0 && c[lena] == 0) lena--;
//输出
for (int i = lena; i >= 0; i--){
cout << c[i];
}
return 0;
}
高精度除法
//顶级垃圾程序
//A very bad program
#include <bits/stdc++.h>
using namespace std;
string s1;
long long a[5100], b, c[5100], r; //被除数,除数,答案,余数
int main(){
cin >> s1 >> b;
int la = s1.size();
//正序存入
for (int i = 0; i < la; i++){
a[i] = s1[i] - '0';
}
//除
for (int i = 0; i < la; i++){
//加上上一位的余数再做除法
c[i] = (r * 10 + a[i]) / b;
//求余数
r = (r * 10 + a[i]) % b;
}
int lc = 0;
//去前导零
while (lc < la - 1 && c[lc] == 0) lc++;
//输出
for (int i = lc; i < la; i++){
cout << c[i];
}
return 0;
}