//无论开多大的数都可以,用的很爽;
string sum(string s1,string s2)
{
if(s1.length()<s2.length())
{
string temp=s1;
s1=s2;
s2=temp;
}
int i,j;
for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
{
s1[i]=char(s1[i] (j>=0?s2[j]-'0':0));
if(s1[i]-'0'>=10)
{
s1[i]=char((s1[i]-'0')%10 '0');
if(i) s1[i-1] ;
else s1='1' s1;
}
}
return s1;
}
string sub(string str1,string str2)//高精度减法
{
string str;
int tmp=str1.length()-str2.length();
int cf=0;
for(int i=str2.length()-1;i>=0;i--)
{
if(str1[tmp i]<str2[i] cf)
{
str=char(str1[tmp i]-str2[i]-cf '0' 10) str;
cf=1;
}
else
{
str=char(str1[tmp i]-str2[i]-cf '0') str;
cf=0;
}
}
for(int i=tmp-1;i>=0;i--)
{
if(str1[i]-cf>='0')
{
str=char(str1[i]-cf) str;
cf=0;
}
else
{
str=char(str1[i]-cf 10) str;
cf=1;
}
}
str.erase(0,str.find_first_not_of('0'));//去除结果中多余的前导0
return str;
}
相乘 string mul(string str1,string str2)
{
string str(str1.size() str2.size() 5,'0');
reverse(str1.begin(),str1.end()); //翻转字符串str1
reverse(str2.begin(),str2.end()); //翻转字符串str2
int num=0,h=0;
for(int i=0;i<str1.size();i ) //o(n^2)的方法模拟str1*str2(平时用的笔算乘法)
{
h=i;
for(int j=0;j<str2.size();j )
{
num =str[h]-'0' (str1[i]-'0')*(str2[j]-'0');
str[h ]=num%10 '0';
num/=10;
}
while(num)
{
str[h ]=num%10 '0';
num/=10;
}
}
for(int i=str1.size() str2.size() 4;i>=0;i--) //去前导0
{
if(str[i]=='0')
str.erase(i);
else
break;
}
reverse(str.begin(),str.end());//翻转结果的字符串str
return str;
}
|
|
来自: 昵称54301888 > 《文件夹1》