//无论开多大的数都可以,用的很爽; 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; }