各类大数模板
Posted ISGuXing
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了各类大数模板相关的知识,希望对你有一定的参考价值。
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 return s1; 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 }
以上是关于各类大数模板的主要内容,如果未能解决你的问题,请参考以下文章