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


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

    先写简单的加减吧,

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

     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.......就这样吧,除法不常用就不想写了。

  • 相关阅读:
    POJ 2431 Expedition(探险)
    POJ 3253 Fence Repair(修篱笆)
    POJ 3069 Saruman's Army(萨鲁曼军)
    POJ 3617 Best Cow Line(最佳奶牛队伍)
    [蓝桥杯] 排它平方数
    [蓝桥杯] 小朋友排队
    UVA315 Network 连通图割点
    POJ 1236 Network of Schools 连通图缩点
    poj1061 青蛙的约会
    拓展欧几里
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/8945292.html
Copyright © 2020-2023  润新知