1. 程式人生 > >各類大數模板

各類大數模板

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 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 }  

各類大數模板