您的位置:首页 > 其它

高精度加减乘除模板

2014-11-14 13:25 337 查看
<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;
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: