一、高精度加法

//顶级垃圾程序
//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;
}