关于大数的加减乘和比较模板

由于深受大数的压榨,不得不写几个模板自己套用,

先写简单的加减吧,

大数以字符串输入,最后返回的值也是字符串型的。

 1 string bigadd(string s,string ss){
 2     string tt;
 3     int slen = s.length();
 4     int sslen = ss.length();
 5     reverse(s.begin(),s.end());
 6     reverse(ss.begin(),ss.end());
 7     int index = 0;
 8     for(int i=0;i<min(slen,sslen);i++){
 9         int a = s[i]-'0',b = ss[i]-'0';
10         int at = a+b+index;
11         if(at>9){
12             tt+=at-10+'0';
13             index = 1;
14         }else{
15             tt+=at+'0';
16             index = 0;
17         }
18     }
19     for(int i=min(slen,sslen);i<max(slen,sslen);i++){
20         if(slen>i){
21             int a = s[i]-'0';
22             int at = a+index;
23             if(at>9){
24                 tt+=at-10+'0';
25                 index = 1;
26             }else{
27                 tt+=at+'0';
28                 index = 0;
29             }
30         }else{
31             int b = ss[i]-'0';
32             int at = b+index;
33             if(at>9){
34                 tt+=at-10+'0';
35                 index = 1;
36             }else{
37                 tt+=at+'0';
38                 index = 0;
39             }
40         }
41     }
42     if(index){
43         tt+='1';
44     }
45     reverse(tt.begin(),tt.end());
46     return tt;
47 }

大数减法:

同样也是先输入两个字符串型的大数,但是这里有个前提就是,s>=ss;

可以输入之前先比较一下啊,

用比较函数,如下:

 1 string bigdel(string s,string ss){//s>=ss
 2     string tt,st;
 3     int slen = s.length();
 4     int sslen = ss.length();
 5     reverse(s.begin(),s.end());
 6     reverse(ss.begin(),ss.end());
 7     int index = 0;
 8     for(int i=0;i<sslen;i++){
 9         int a = s[i]-'0';
10         int b = ss[i]-'0';
11         int at = a-b-index;
12         if(at<0){
13             tt+=at+10+'0';
14             index = 1;
15         }else{
16             tt+=at+'0';
17             index = 0;
18         }
19     }
20     for(int i=sslen;i<slen;i++){
21         int b = s[i]-'0';
22         int at = b - index;
23         if(at<0){
24             tt+=at+10+'0';
25             index = 1;
26         }else{
27             tt+=at+'0';
28             index = 0;
29         }
30     }
31     bool prime = true;
32     for(int i = slen-1;i>=0;i--){
33         if(tt[i]!='0'){
34             prime = false;
35         }
36         if(!prime){
37             st+=tt[i];
38         }
39     }
40     if(st.length()==0)
41         st+='0';
42     return st;
43 }

比较两个字符串大小,

这里返回的是int类型的,如果s>ss 返回1,s<ss 返回0,s==ss返回2;

 1 int compare(string s,string ss){
 2     int slen = s.length();
 3     int sslen = ss.length();
 4     if(slen==sslen){
 5         for(int i=0;i<slen;i++){
 6             if(s[i]==ss[i]){
 7                 continue;
 8             }else{
 9                 return s[i]>ss[i];
10             }
11         }
12     }else{
13         return slen > sslen;
14     }
15     return 2;
16 }

大数乘法:

输入两个数字符串,最后返回的也是字符串。

 1 string bigmulti(string s,string ss){
 2     int slen = s.length();
 3     int sslen= ss.length();
 4     int st[20100];
 5     string tt="";
 6     reverse(s.begin(),s.end());
 7     reverse(ss.begin(),ss.end());
 8     for(int i=0;i<slen;i++){
 9         for(int j=0;j<sslen;j++){
10             st[i+j] += (s[i]-'0')*(ss[j]-'0');
11         }
12     }
13     for(int i=0;i<slen+sslen;i++){
14         st[i+1]+=st[i]/10;
15         st[i]=st[i]%10;
16     }
17     int index;
18     for(int i=slen+sslen;i>=0;i--){
19         if(st[i]!=0){
20             index = i;
21             break;
22         }
23     }
24     for(int i=0;i<=index;i++){
25         tt+=st[i]+'0';
26     }
27     reverse(tt.begin(),tt.end());
28     return tt;
29 }

emmmmmmm.......就这样吧,除法不常用就不想写了。

原文地址:https://www.cnblogs.com/zllwxm123/p/8945292.html