各類大數模板
阿新 • • 發佈:2017-07-28
logs tails exce temp tmp article break 除法 char
ps:轉自http://blog.csdn.net/y990041769/article/details/20116995
大數加法模板(本人驗證過,其他還沒用,只是寫在這)
1 string sum(string s1,string s2) 2 { 3 if(s1.length()<s2.length()) 4 { 5 string temp=s1; 6 s1=s2; 7 s2=temp; 8 } 9 int i,j; 10 for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--) 11 { 12 s1[i]=char(s1[i]+(j>=0?s2[j]-‘0‘:0)); //註意細節 13 if(s1[i]-‘0‘>=10) 14 { 15 s1[i]=char((s1[i]-‘0‘)%10+‘0‘); 16 if(i) s1[i-1]++; 17 else s1=‘1‘+s1; 18 } 19 } 20 returns1; 21 }
大數乘法模版:
1 string Mult(string s,int x) //大數乘以整形數 2 { 3 reverse(s.begin(),s.end()); 4 int cmp=0; 5 for(int i=0;i<s.size();i++) 6 { 7 cmp=(s[i]-‘0‘)*x+cmp; 8 s[i]=(cmp%10+‘0‘); 9 cmp/=10; 10 } 11 while(cmp) 12{ 13 s+=(cmp%10+‘0‘); 14 cmp/=10; 15 } 16 reverse(s.begin(),s.end()); 17 return s; 18 } 19 string Multfa(string x,string y) //大數乘法 20 { 21 string ans; 22 for(int i=y.size()-1,j=0;i>=0;i--,j++) 23 { 24 string tmp=Mult(x,y[i]-‘0‘); 25 for(int k=0;k<j;k++) 26 tmp+=‘0‘; 27 ans=sum(ans,tmp); 28 } 29 return ans; 30 }
大數除法模板
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; }
浮點的N次方
1 string Multiply(string s,long x) //大數乘以整形數 2 { 3 reverse(s.begin(),s.end()); 4 long cmp=0; 5 for(int i=0; i<s.size(); i++) 6 { 7 cmp=(s[i]-‘0‘)*x+cmp; 8 s[i]=(cmp%10+‘0‘); 9 cmp/=10; 10 } 11 while(cmp) 12 { 13 s+=(cmp%10+‘0‘); 14 cmp/=10; 15 } 16 reverse(s.begin(),s.end()); 17 return s; 18 } 19 string Remove_later(string s) //刪除一個字符串的後倒0 20 { 21 int ok=1; 22 for(int i=s.size()-1; i>=0; i--) 23 { 24 if(s[i]==‘0‘){ 25 s.erase(i); 26 } 27 else if(s[i]==‘.‘) 28 { 29 s.erase(i); 30 ok=0; 31 } 32 else 33 ok=0; 34 if(ok==0) 35 break; 36 } 37 return s; 38 } 39 string factorial(string s,int n) //浮點數的n次方 40 { 41 if(n==0) 42 return "1"; 43 string cmp="",count=""; 44 long x=0,point=0; 45 for(int i=0; i<s.size(); i++) 46 if(s[i]!=‘.‘) 47 { 48 cmp+=s[i]; 49 x=x*10+(s[i]-‘0‘); 50 } 51 else 52 point=s.size()-1-i; 53 for(int i=1; i<n; i++) 54 { 55 cmp=Multiply(cmp,x); 56 } 57 int ans_point=cmp.size()-n*point; 58 if(ans_point<0) 59 { 60 count+=‘.‘; 61 for(int i=ans_point; i!=0; i++) 62 count+=‘0‘; 63 } 64 string::iterator it=cmp.begin(); 65 if(ans_point>=0&&ans_point<cmp.size()) 66 cmp.insert(it+ans_point,‘.‘); 67 count+=(Remove_later(cmp)); 68 return count; 69 }
字符串去除後導0函數,前導0可以先反轉取後導。
1 string Remove_later(string s) //刪除一個字符串的後倒0 2 { 3 for(int i=s.size()-1; i>=0; i--) 4 { 5 if(s[i]==‘0‘) 6 s.erase(i); 7 else 8 break; 9 } 10 return s; 11 }
各類大數模板