大數問題解決模板
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; }
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; }
大數x大數
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; }
OK,就總結這麽多了。,主要的應該都有了,其它的遇到再寫吧。。
。
部分內容來自http://blog.csdn.net/y990041769/article/details/20116995
有問題請跟帖指正,謝謝!
大數問題解決模板