1.首先实现两个字符串形式的大数大小比较
int cmp(string a,string b) //若a>b,则返回1,若a==b,则返回-1,若a<b,则返回0
{
a=a.substr(a.find_first_not_of('0'));
b=b.substr(b.find_first_not_of('0'));
if(a.length()>b.length())
return 1;
else if(a.length()==b.length())
{
if(a>b)
return 1;
else if(a==b)
return -1;
return 0;
}
else
return 0;
}
2.大数加法的实现
string add(string a,string b)
{
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
int len=b.length();
int lenb=a.length();
string ans(len+10,'0');
int d1,temp=0;
int d2,sum;
for(int i=0; i<len+10; i++)
{
if(i<lenb)
{
d1=a[i]-'0';
d2=b[i]-'0';
sum=d1+d2+temp;
}
else if(i<len)
{
d1=b[i]-'0';
sum=d1+temp;
}
else
{
sum=temp;
}
ans[i]=sum%10+'0';
temp=sum/10;
}
reverse(ans.begin(),ans.end());
ans=ans.substr(ans.find_first_not_of('0'));
return ans;
}
3.大数减法的实现
string subtract(string a,string b)
{
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
string ans=a;
for(int i=0; i<b.length(); i++)
{
int k=1;
if((a[i]-'0')<(b[i]-'0'))
{
while(a[i+k]=='0')
{
a[i+k]='9';
k++;
}
a[i+k]=(a[i+k]-'0')-1+'0';
ans[i]=a[i]-'0'+10-(b[i]-'0')+'0';
}
else
{
ans[i]=a[i]-'0'-(b[i]-'0')+'0';
}
}
for(int j=b.length(); j<a.length(); j++)
{
ans[j]=a[j];
}
reverse(ans.begin(),ans.end());
ans=ans.substr(ans.find_first_not_of('0'));
return ans;
}
4.将整数转换为字符串 (后面大数除法会用到)
void i2s(int n,string&str)
{
stringstream sstr;
sstr << n;
str = sstr.str();
}
5.大数除法的实现(仅实现了除数大于被除数的情况)
string divide(string a,string b,int m) //m为小数点后多少位,
{
string ans="0.";
for(int i=0; i<m; i++)
{
a.append("0");
int t=0;
while(cmp(a,b)==1)
{
a=subtract(a,b);
t++;
}
string str;
i2s(t,str);
ans.append(str);
}
return ans;
}
上面的代码实现都可以单独使用,不保证完全正确,欢迎指出错误,有不明白的也欢迎留言.