C/C++做大数问题真是累啊有木有。。。总结点模板,在遇见就直接套
大数+大数:
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;//连接1和s1,增位 } } return s1; }
#include<iostream> #include<string> using namespace std; int sign;//标记,反应结果正负情况 int compare(string s1,string s2) { int len1=s1.length(),len2=s2.length(); if(len1<len2) return 1; if(len1==len2) for(int i=0;i<len1;i++) if(s1[i]<s2[i]) return 1; return 0; } string dele(string s)//去除0 { int t=s.length(),k=0,sign=0; string str; for(int i=0;i<t;i++) { if((s[i]-'0')) { sign=1; str.resize(t-i);//这里很重要,string字串必须提前指明大小 for(int j=i;j<t;k++,j++) str[k]=s[j]; break; } } if(!sign) str="0"; return str; } string diff(string s1,string s2)//相减 { sign=0; if(compare(s1,s2)) { string temp=s1; s1=s2; s2=temp; sign=1; } int i,j; for(i=s1.length()-1,j=s2.length()-1;j>=0;i--,j--) { if(s1[i]>=s2[j]){ s1[i]=s1[i]-s2[j]+'0'; } else { s1[i]=s1[i]+10-s2[j]+'0'; //比较函数告诉我们若要使s1[i]<s2[i],那么i注定不可能是0 s1[i-1]--; } } return s1; } int main() { string s1,s2,s; cin>>s1>>s2; s=diff(s1,s2); s=dele(s); if(sign) cout<<"-"; cout<<s<<endl; return 0; }大数x整形数:
string Multiply(string s,int x) //大数乘以整形数 { reverse(s.begin(),s.end()); int cmp=0; for(int i=0;i<s.size();i++) { cmp=(s[i]-'0')*x+cmp; s[i]=(cmp%10+'0'); cmp/=10; } while(cmp) { s+=(cmp%10+'0'); cmp/=10; } reverse(s.begin(),s.end()); return s; }
string Except(string s,int x) //大数除以整形数 { int cmp=0,ok=0; string ans=""; for(int i=0;i<s.size();i++) { cmp=(cmp*10+s[i]-'0'); if(cmp>=x) { ok=1; ans+=(cmp/x+'0'); cmp%=x; } else{ if(ok==1) ans+='0'; //注意这里啊。才找出错误 } } return ans; }
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 Mult(string s,int x) //大数乘以整形数 { reverse(s.begin(),s.end()); int cmp=0; for(int i=0;i<s.size();i++) { cmp=(s[i]-'0')*x+cmp; s[i]=(cmp%10+'0'); cmp/=10; } while(cmp) { s+=(cmp%10+'0'); cmp/=10; } reverse(s.begin(),s.end()); return s; } string Multfa(string x,string y) //大数乘法 { string ans; for(int i=y.size()-1,j=0;i>=0;i--,j++) { string tmp=Mult(x,y[i]-'0'); for(int k=0;k<j;k++) tmp+='0'; ans=sum(ans,tmp); } return ans; }
有问题请跟帖指正,谢谢!