大数加法、大数减法和大数乘法,模拟竖式计算方式:

加法:

#include<iostream>
#include<string>
using namespace std;

string x, y;
int la, lb, lc, a[1000005], b[1000005], c[1000005]; 

int max(int i ,int j) {
	return (i > j) ? i : j;
}

int main() {
	cin >> x >> y;
	
	la = x.length();
	lb = y.length();
	lc = max(la, lb);   //两个数相加位数取最大的,或者最大的加一 
	
	for(int i = 0 ; i < la ; i++) {    //将字符串逆序保存到数组中 
		a[la - i] = x[i] - '0';        //因为我们算竖式加法是从后往前算的 
	}
	
	for(int i = 0 ; i < lb ; i++) {
		b[lb - i] = y[i] - '0';
	}
	
	for(int i = 1 ; i <= lc ; ++i) {  
		c[i] += a[i] + b[i];        //两个位数相加 
		c[i + 1] = c[i] / 10;       //进位 
		c[i] %= 10;                 //进位完成之后它自己剩余的 
	}
	
	if(c[lc+1] > 0) lc++;           //如果发现最后一位大于0,说明两个数相加之后,总位数为最大长度再加一      
	
	for(int i = lc ; i > 0 ; --i) {   //因为我们之前有过逆序操作,所以再逆序输出就得到结果了 
		cout << c[i];
	}
	
	return 0;
}

减法:

#include<iostream>
#include<string>
using namespace std;

string x, y;
int la, lb, a[100005], b[100005], c[100005];

int main() {
	cin >> x >> y;
	la = x.length();
	lb = y.length();
	
	if(la < lb || la == lb && x < y) {  //将小数减大数转换成大数减小数,加上负号 
		swap(x, y);
		swap(la, lb);
		cout <<'-';
	}
	
	for(int i = 0 ; i < la ; ++i) {
		a[la - i] = x[i] - '0';
	}
	
	for(int i = 0 ; i < lb ; ++i) {
		b[lb - i] = y[i] -'0';
	}
	
	for(int i = 1; i <= la ; ++i) {
		if(a[i] < b[i]) {   //小数减大数,借位 
			a[i] += 10;
			a[i + 1]--;				
		}
		c[i] = a[i] - b[i];
	}
	
	while(c[la] == 0 && la > 1) la--;    //如果前面有0,去除,但是最少要保留一个0 
	
	for(int i = la ; i > 0 ; --i) {
		cout << c[i];            //逆序输出 
	}
	return 0;
}

乘法:

#include<iostream>
#include<string>
using namespace std;

string x, y;
int la, lb, lc, a[100005], b[100005], c[100005];

int main() {
	cin >> x >> y;
	la = x.length();
	lb = y.length();

	for(int i = 0 ; i < la ; ++i) {
		a[la - i] = x[i] - '0';
	}

	for(int i = 0 ; i < lb ; ++i) {
		b[lb - i] = y[i] - '0';
	}

	for(int i = 1 ; i <= la ; ++i) {
		for(int j = 1 ; j <= lb ; ++j) {
			c[i + j - 1] += a[i] * b[j];      //乘法操作 
			c[i + j] += c[i + j - 1] / 10;    //进位,和加法操作一样 
			c[i + j - 1] %= 10;     
		}
	}

	lc = la + lb;   //两个数相乘,最终的位数可能是俩乘数的位数和,也有可能是位数和减一 

	while(c[lc] == 0 && lc > 1) lc--;   //如果前面有0,还是像减法那样消去 

	for(int i = lc ; i > 0 ; --i) {
		cout << c[i];
	}

	return 0;
}

如果觉得代码理解起来有点困难,带数值进去模拟。


立志成为一名攻城狮