高精度加减乘除模板

<pre name="code" class="cpp">#include<iostream>
#include<string>
using namespace std;

//对位补0
void alignZero(string& s1, string& s2)
{
	while(s1.length() < s2.length())
		s1 = '0' + s1;
	while(s2.length() < s1.length())
		s2 = '0' + s2;
}

//清除高位多余的0
string clearZero(string s)
{
	while(s.length() > 0 && s[0] == '0')
		s.erase(0,1);
	return s;

}

//判断两个字符串的大小,返回S1>S2的布尔值
bool bigger(string s1, string s2)
{
	if(s1.length() > s2.length() )
		return true;
	if(s1.length() == s2.length() && s1>=s2)
		return true;
	return false;
}
/***************加加加加加******************/
/*先对位补0,然后从低位开始,若和大于9,则向高位仅为,最后清除高位多余的0*/
string addition(string s1, string s2)
{
	int i;
	string result;
	alignZero(s1,s2);
	s1 = '0' + s1; //考虑首位可能进位,在首位中增加一个0处理进位
	s2 = '0' + s2;

	for(i=s1.length()-1; i>=0; i--){
		s1[i] += s2[i] - '0';
		if(s1[i] > '9'){
			s1[i] -= 10;
			s1[i-1]++;
		}
	}
	result = clearZero(s1);
	return result;
}
/***************减减减减减******************/
/*对位补0,从低位开始减法,向高位借位,未处理减数大于被减数的情况*/
string substration(string s1, string s2)
{
	int i; 
	string result;
	alignZero(s1, s2);

	for(i=s1.length()-1; i>=0; i--){
		if(s1[i] < s2[i]){
			s1[i-1]--;
			s1[i] += 10;
		}
		s1[i] -= (s2[i] - '0');
	}
	result = clearZero(s1);
	return result;
}
/***************乘乘乘乘乘******************/
/*两数其中一个为0,返回0*/
/*从低位开始,多位数乘多位数化简为多位数乘一位数,又化简为加法,字符串加‘0’,然后对乘数每一位上的数字进行对应次数的加法*/
string multiply(string s1, string s2)
{
	if(s1=="0" || s2=="0")
		return "0";
	int i; char c; 
	string result="0";

	for(i=s2.length()-1; i>=0; i--){
		for(c='1'; c<=s2[i]; c++)
			result = addition(result, s1);
		s1 = s1 + '0';
	}
	result = clearZero(result);
	return result;

}
/***************除除除除除******************/

string division(string s1, string s2)
{
	int i;
	string result="", s="";
	for(i=0; i<s1.length(); i++){
		s = s+s1[i];
		result = result + '0';
		while(bigger(s,s2)){/*从0-9试商,若相减后余数小于除数,试商结束*/
			result[result.length()-1]++;
			s= substration(s,s2);
		}
	}
	result = clearZero(result);
	return result;
}

int main()
{
	string s1,s2;
	while(cin >> s1){
		cin >> s2;
		cout << "+" << addition(s1,s2)<< endl;
		cout << "-" << substration(s1,s2)<< endl;
		cout << "*" << multiply(s1,s2)<< endl;
		cout << "/" << division(s1,s2)<< endl;

		cout << endl;
	}

	return 0;
}




                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值