大数模板 加减乘除

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
//初始化
void initial(string &a, string &b){
	while (a.size()<b.size())a = '0' + a;
	while (b.size()<a.size())b = '0' + b;
}
//打印
void print(string &a, string &b){
	cout << a << endl;
	cout << b << endl;
}
//找出最大的字符串
void findMax(string &a, string &b){
	string tmp;
	if (a<b){
		tmp = b;
		b = a;
		a = tmp;
	}
}
//删除第一个字符'0'
bool del(string &a){
	if (a[0] == '0'){
		a.erase(0, 1);
		return true;
	}
	else
		return false;
}
//删除前面所有的 0
void delAllZroe(string &a){
	while (del(a)){
		del(a);
	};
}
//大数加法
string bigItergeAdd(string a, string b){
	initial(a, b);
	a = '0' + a;
	b = '0' + b;
	for (int i = a.size() - 1; i >= 0; i--){
		int num1 = a[i] - '0';
		int num2 = b[i] - '0';
		if (num1 + num2>9){
			a[i - 1] = a[i - 1] - '0' + 1 + '0';
			a[i] = (num1 + num2) - 10 + '0';
		}
		else{
			a[i] = (num1 + num2) + '0';
		}
	}
	del(a);
	//	cout<<a<<endl;
	return a;
}
//大数减法
string bigItergeSub(string a, string b){
	initial(a, b);
	findMax(a, b);
	for (int i = a.size() - 1; i >= 0; i--){
		int num1 = a[i] - '0';
		int num2 = b[i] - '0';
		if (num1<num2){
			a[i - 1] = a[i - 1] - '0' - 1 + '0';
			a[i] = (num1 + 10 - num2) + '0';
		}
		else{
			a[i] = (num1 - num2) + '0';
		}
	}
	del(a);
	//	cout<<a<<endl;
	return a;
}
//大数乘法(大数加法实现)
void bigItergeMul(string a, string b){
	delAllZroe(a);
	delAllZroe(b);
	if (a == "" || b == ""){ 
printf("0\n"); return; 
}
	initial(a, b);
	findMax(a, b);
	string res = "0";
	int count = 0;
	delAllZroe(b);
	for (int i = b.size() - 1; i >= 0; i--){
		int num1 = b[i] - '0';
		if (i != b.size() - 1)		a = a + '0';
		for (int i = 1; i <= num1; i++){
			res = bigItergeAdd(res, a);
		}
	}
	delAllZroe(res);
	cout << res << endl;
}
//大数除法
void bigItergeDiv(string a, string b){
	initial(a, b);
	if (a<b){ cout << "0" << endl;	return; }
	delAllZroe(b);
	string res = "0";
	string restmp = "1";
	string tmp = b;
	for (int i = 1; i<(a.size() - b.size()); i++){
		tmp += '0';
		restmp += '0';
	}
	initial(a, b);
	while (a >= b){
		initial(a, tmp);
		if (a >= tmp){
			a = bigItergeSub(a, tmp);
			res = bigItergeAdd(res, restmp);
		}
		else{
			tmp.erase(tmp.size() - 1);
			restmp.erase(restmp.size() - 1);
			initial(a, tmp);
			if (a >= tmp){
			 a = bigItergeSub(a, tmp);
			 res=bigItergeAdd(res, restmp);
			}
		}
		initial(a, b);
	}
	cout << res << endl;
}
//阶乘(0~10000)
void factorial(int n){
	int num[50000];
	memset(num, 0, sizeof(num));
	num[0] = 1;
	num[1] = 1;
	for (int i = 1; i <= n; i++){
		int len = num[0];
		for (int j = 1; j <= len; j++){
			num[j] *= i;
		}
		for (int j = 1; j <= num[0]; j++){
			if (num[j]>9){
				num[j + 1] += num[j] / 10;
				num[j] %= 10;
			}
			if (num[num[0] + 1] != 0)num[0]++;
		}

	}
	for (int i = num[0]; i>0; i--){
		printf("%d", num[i]);
	}
	printf("\n");
}

int main(){
	string a, b;
	while (cin >> a >> b){
		bigItergeAdd(a,b);
//		bigItergeSub(a,b);
//		bigItergeMul(a,b);
//		bigItergeDiv(a,b);
	}
//	int n;
//	while(scanf("%d",&n)!=EOF){
//		factorial(n);
//	}
	return 0;
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值