您的位置:首页 > 其它

高精度 大数减法

2015-04-23 22:21 260 查看
INPUT :任意两个大数

OUTPUT :输出两个大数的相减的结果(结果可以为负)

之前用char类字符串做每位的转换比较麻烦 但是改为string型做大数减法比较简单

代码如下:

#include <iostream>
#include <cstring>
using namespace std;
string a,b;
string  substr(string a,string b )
{
int  i,j,k,flag=1;
string s1,s2;
if(a.size()<b.size()||a.size()==b.size()&&a.compare(b)<0)
{
//a的长度小于b的长度  或者 a的长度等于b的长度 a小于b
s1=a;
a=b;
b=s1;
flag=0;
}
//始 终 令 a 的 长 度 大 于 b 的长度
while (a.length()-1>b.length()-1)  b='0'+b;          //字符短的加前导零,使他们一样长

for (i=a.length()-1; i>=1; i--)        //减,规整  最高位单独处理
{
if(a[i]>=b[i])
a[i]=a[i]-b[i];
else
{
a[i]=a[i]-b[i];
a[i]=a[i]+10;
a[i-1]=a[i-1]-1;
}
}
a[0]=a[0]-b[0];                 //  a must more than b

for( i=0; i<a.length(); i++)
a[i]+=48;

for(i=0; i<a.length(); i++)     // 去零 from high to low
if(a[i]!='0')
break;

if(i==a.length())
{
a="0";
return a;
}

for(j=i,k=0; j<a.length(); j++,k++)
s2=s2+a[j];

if(flag!=1)
{
s2='-'+s2;
}
return s2;
}
int main()
{
while(cin>>a>>b)
{
cout<<substr(a,b)<<endl;
}
return 0;
}
高精度问题要熟练 最好背过 比赛的时候能熟练的敲出来
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: