• 大数加减乘除模板


    大数加法:

      1 #include <stdio.h>
      2 
      3 #include <string.h>
      4 
      5 #define M 100 //定义了数量M是100作为数组初始化的数量 
      6 
      7  
      8 
      9 int main()
     10 
     11 {
     12 
     13     int i, j, len_s1, len_s2;    // len_s1是字符数组s1的长度, len_s2是字符数组s2的长度,
     14 
     15     char s1[M], s2[M];
     16 
     17     int num1[M] = {0};           // 数字数组num1 
     18 
     19     int num2[M] = {0};           // 数字数组num2 
     20 
     21     scanf("%s %s", s1, s2);    
     22 
     23     len_s1 = strlen(s1);         //    求第一个加数的位数 
     24 
     25     len_s2 = strlen(s2);         // 求第二个加数的位数 
     26 
     27     if(len_s1==1 && len_s2==1){
     28         printf("%d
    ",s1[0]-'0'+s2[0]-'0');
     29         return 0;
     30     }
     31 
     32     for(i=len_s1-1, j=0; i>=0; i--)   //将字符数组转化为数字数组,并倒数存放,作为第一个加数 
     33 
     34     {
     35 
     36         num1[j] = s1[i] - '0';
     37 
     38         j++;
     39 
     40     }
     41 
     42     for(i=len_s2-1, j=0; i>=0; i--)   //将字符数组转化为数字数组,并倒数存放,作为第二个加数 
     43 
     44     {
     45 
     46         num2[j] = s2[i] - '0';
     47 
     48         j++;
     49 
     50     }
     51 
     52     
     53 
     54     for(i=0; i<=M; i++)               //实现大数的加法 
     55 
     56     {
     57 
     58         num1[i] = num1[i]+num2[i];
     59 
     60         if(num1[i]>9)
     61 
     62         {
     63 
     64             num1[i] = num1[i]-10;
     65 
     66             num1[i+1]++;     
     67 
     68         }    
     69 
     70     }
     71 
     72     
     73 
     74     for(i=M-1; i>=0&&num1[i]==0; i--);  //求得最终结果的位数 
     75 
     76     
     77 
     78     if(i>0)
     79 
     80     {
     81 
     82         for(; i>=0; i--)                    //最终答案的输出 
     83 
     84         {
     85 
     86             printf("%d", num1[i]);    
     87 
     88         }
     89 
     90     }
     91 
     92     else 
     93 
     94         printf("0");
     95         
     96     printf("
    ");
     97      
     98     return 0;
     99 
    100 }
    101 
    102  
    View Code

    大数减法:

      1 #include <stdio.h>
      2 
      3 #include <string.h>
      4 
      5  
      6 
      7 //设置初始数组个数为100 
      8 
      9 #define M 100
     10 
     11  
     12 
     13 int main()
     14 
     15 {
     16 
     17     char str_a[M], str_b[M];       // 字符数组的初始化 
     18 
     19     int num_a[M] = {0};            // 被减数数组 
     20 
     21     int num_b[M] = {0};            // 减数数组 
     22 
     23     int num_c[M];                  // 差值数组 
     24 
     25     int len_a, len_b;              // 被减数位数,减数位数 
     26 
     27     int i, j, k, n, f=0;
     28 
     29     
     30 
     31     scanf("%s %s", str_a, str_b);
     32 
     33     
     34 
     35     len_a = strlen(str_a);
     36 
     37     len_b = strlen(str_b);
     38 
     39     
     40 
     41     //K的值是参与运算的数据最大位数 
     42 
     43     if(len_a>len_b)
     44 
     45         k = len_a;
     46 
     47     else 
     48 
     49         k = len_b;    
     50 
     51     num_c[0] = 0;
     52 
     53         
     54 
     55     //n>0表示a>b, n<0表示a<b, n=0表示a=b 
     56 
     57     if(len_a > len_b)
     58 
     59         n = 1;
     60 
     61     else if(len_a == len_b)
     62 
     63         n = strcmp(str_a, str_b);
     64 
     65     else 
     66 
     67         n = -1;
     68 
     69         
     70 
     71     //字符数组倒序后位数对齐存在整数数组中 
     72 
     73     for(i=len_a-1, j=0; i>=0; i--, j++)
     74 
     75     {
     76 
     77         num_a[j] = str_a[i] - '0';    
     78 
     79     } 
     80 
     81     for(i=len_b-1, j=0; i>=0; i--, j++)
     82 
     83     {
     84 
     85         num_b[j] = str_b[i] - '0';    
     86 
     87     }    
     88 
     89  
     90 
     91     //具体执行减法运算 
     92 
     93     for(i=0; i<k; i++)
     94 
     95     {
     96 
     97         if(n>=0)
     98 
     99         {
    100 
    101             if(num_a[i]-num_b[i] >= 0)
    102 
    103                 num_c[i] = num_a[i] - num_b[i];
    104 
    105             else 
    106 
    107             {
    108 
    109                 num_c[i] = num_a[i] + 10 - num_b[i];
    110 
    111                 num_a[i+1]--;
    112 
    113             }
    114 
    115         }
    116 
    117         else 
    118 
    119         {
    120 
    121             if(num_b[i]-num_a[i] >= 0)
    122 
    123                 num_c[i] = num_b[i] - num_a[i];
    124 
    125             else
    126 
    127             {
    128 
    129                 num_c[i] = num_b[i] + 10 - num_a[i];
    130 
    131                 num_b[i+1]--;
    132 
    133             }
    134 
    135         }
    136 
    137     }
    138 
    139     
    140 
    141     //最终结果的输出 
    142 
    143     if(n<0)
    144 
    145         printf("-");
    146 
    147     for(i=k-1; i>=0; i--)
    148 
    149     {
    150 
    151         if(num_c[i])
    152 
    153             f=1;
    154 
    155         if(f||i==0)
    156 
    157             printf("%d", num_c[i]);
    158 
    159     }
    160 
    161     printf("
    ");
    162 
    163     return 0;
    164 
    165 } 
    166 
    167  
    View Code

    大数乘法:

     1 #include<bits/stdc++.h>
     2 
     3 using namespace std;
     4 
     5 char a[10005],b[10005];
     6 
     7 int x[10005],y[10005],z[20005];
     8 
     9 int main()
    10 
    11 {
    12 
    13     int l1,l2,i,j,k;
    14 
    15     while(~scanf(" %s %s",a,b))
    16 
    17     {
    18 
    19         memset(z,0,sizeof(z));
    20 
    21         l1=strlen(a),l2=strlen(b);
    22 
    23         for(j=0,i=l1-1;i>=0;i--)
    24 
    25             x[j++]=a[i]-'0';
    26 
    27         for(j=0,i=l2-1;i>=0;i--)
    28 
    29             y[j++]=b[i]-'0';
    30 
    31         for(i=0;i<l1;i++)
    32 
    33             for(j=0;j<l2;j++)
    34 
    35                 z[i+j]+=x[i]*y[j];
    36 
    37         for(k=0;k<l1+l2-1;k++)
    38 
    39             if(z[k]>=10)
    40 
    41             {
    42 
    43                 z[k+1]+=z[k]/10;
    44 
    45                 z[k]%=10;
    46 
    47             }
    48 
    49         for(i=k;i>0;i--)
    50 
    51         {
    52 
    53             if(z[i]==0)
    54 
    55                 continue;
    56 
    57             else
    58 
    59                 break;
    60 
    61         }
    62 
    63         for(;i>=0;i--)
    64 
    65             printf("%d",z[i]);
    66 
    67         printf("
    ");
    68 
    69     }
    70 
    71     return 0;
    72 
    73 }
    View Code

    大数除法(大数除大数):

      1 #include<stdio.h>
      2 
      3 #include<string.h>
      4 
      5 char a[100],b[100];//用两个字符串用来输入两个大数 
      6 
      7 int x[100],y[100],z[100],m[100];//被除数  除数  商  余数 
      8 
      9 int digit;//大数的位数 
     10 
     11 void sub(int x[],int y[],int len1,int len2)//大数减法 
     12 
     13 {
     14 
     15     int i;
     16 
     17     for(i=0;i<len1;i++)
     18 
     19     {
     20 
     21         if(x[i]<y[i])
     22 
     23         {
     24 
     25             x[i]=x[i]+10-y[i];
     26 
     27             x[i+1]--;
     28 
     29         }
     30 
     31         else
     32 
     33             x[i]=x[i]-y[i];
     34 
     35     }
     36 
     37     for(i=len1-1;i>=0;i--)//判断减法结束之后,被除数的位数 
     38 
     39     {
     40 
     41         if(x[i])
     42 
     43         { 
     44 
     45             digit=i+1;
     46 
     47             break;           
     48 
     49         } 
     50 
     51     }
     52 
     53 }
     54 
     55 int judge(int x[],int y[],int len1,int len2)
     56 
     57 {
     58 
     59     int i;
     60 
     61     if(len1<len2)
     62 
     63         return -1;
     64 
     65     if(len1==len2)//若两个数位数相等 
     66 
     67     {
     68 
     69         for(i=len1-1;i>=0;i--)
     70 
     71         {
     72 
     73             if(x[i]==y[i])//对应位的数相等 
     74 
     75                 continue;
     76 
     77             if(x[i]>y[i])//被除数 大于 除数,返回值为1 
     78 
     79                 return 1;
     80 
     81             if(x[i]<y[i])//被除数 小于 除数,返回值为-1 
     82 
     83                 return -1;
     84 
     85         }
     86 
     87         return 0;//被除数 等于 除数,返回值为0 
     88 
     89     }    
     90 
     91 }
     92 
     93 int main()
     94 
     95 {
     96 
     97     int i,j=0,k=0,temp;
     98 
     99     int len1,len2,len;//len两个大数位数的差值   
    100 
    101     while(~scanf("%s %s",a,b))
    102 
    103     {
    104 
    105         len1=strlen(a);//被除数位数
    106 
    107         len2=strlen(b);//除数位数
    108 
    109         for(i=len1-1,j=0;i>=0;i--)//将字符串中各个元素倒序储存在数组中 
    110 
    111             x[j++]=a[i]-'0';
    112 
    113         for(i=len2-1,k=0;i>=0;i--)
    114 
    115             y[k++]=b[i]-'0';            
    116 
    117         if(len1<len2)//当被除数位数 小于 除数位数时 
    118 
    119         {
    120 
    121             printf("商是:0
    ");
    122 
    123             printf("余数是:");
    124 
    125             puts(a); 
    126 
    127         }
    128 
    129         else //当被除数位数 大于或者 除数位数时
    130 
    131         {
    132 
    133             len=len1-len2;//两个大数位数的差值
    134 
    135             for(i=len1-1;i>=0;i--)//将除数后补零,使得两个大数位数相同。被除数:4541543329 除数:98745,加零后:9874500000 
    136 
    137             {
    138 
    139                 if(i>=len)
    140 
    141                     y[i]=y[i-len];
    142 
    143                 else
    144 
    145                     y[i]=0;
    146 
    147             }
    148 
    149             len2=len1;//将两个大数数位相同         
    150 
    151             digit=len1;    //将原被除数位数赋值给digit 
    152 
    153             for(j=0;j<=len;j++)
    154 
    155             {
    156 
    157                 z[len-j]=0;
    158 
    159                 while(((temp=judge(x,y,len1,len2))>=0)&&digit>=k)//判断两个数之间的关系以及位数与除数原位数的关系 
    160 
    161                 {    
    162 
    163                     sub(x,y,len1,len2);    //大数减法函数                
    164 
    165                     z[len-j]++;//储存商的每一位
    166 
    167                     len1=digit;//重新修改被除数的长度
    168 
    169                     if(len1<len2&&y[len2-1]==0)        
    170 
    171                         len2=len1;//将len1长度赋给len2;                        
    172 
    173                 }
    174 
    175                 if(temp<0)//若被除数 小于 除数,除数减小一位。例如:被除数:4541543329 除数:(原)98745,(加零后)9874500000,后退一位后:0987450000 
    176 
    177                 {
    178 
    179                     for(i=1;i<len2;i++)
    180 
    181                         y[i-1]=y[i];
    182 
    183                     y[i-1]=0;
    184 
    185                     if(len1<len2) 
    186 
    187                         len2--;                                            
    188 
    189                 }
    190 
    191             }
    192 
    193             printf("商是:");
    194 
    195             for(i=len;i>0;i--)//去掉前缀0 
    196 
    197             {
    198 
    199                 if(z[i])
    200 
    201                     break;
    202 
    203             }
    204 
    205             for(;i>=0;i--)
    206 
    207                 printf("%d",z[i]);
    208 
    209             printf("
    ");
    210 
    211             printf("余数是:");
    212 
    213             for(i=len1;i>0;i--)
    214 
    215             {
    216 
    217                 if(x[i])
    218 
    219                     break;
    220 
    221             }
    222 
    223             for(;i>=0;i--)
    224 
    225                 printf("%d",x[i]);
    226 
    227             printf("
    ");
    228 
    229         }
    230 
    231     }
    232 
    233     return 0;
    234 
    235 }
    View Code

    大数加减乘多组输入模板:

      1 #include <stdio.h>
      2 #include<iostream>
      3 #include <string.h>
      4 const int M=1e5; //定义了数量M是100作为数组初始化的数量 
      5 const int N=5e4;  //因为我的编译器数组不能开到2e5,乘法的时候要求M<<2,所以开一个M 
      6 using namespace std;
      7 void jia(char s1[M],char s2[M]) 
      8 
      9 {
     10     //printf("%s**%s
    ",s1,s2);
     11     int i, j, len_s1, len_s2;    // len_s1是字符数组s1的长度, len_s2是字符数组s2的长度,
     12 
     13     //char s1[M], s2[M],ch;
     14 
     15     int num1[M] = {0};           // 数字数组num1 
     16 
     17     int num2[M] = {0};           // 数字数组num2 
     18 
     19     //scanf("%s %c %s", s1,ch,s2);    
     20 
     21     len_s1 = strlen(s1);         //    求第一个加数的位数 
     22 
     23     len_s2 = strlen(s2);         // 求第二个加数的位数 
     24 
     25     if(len_s1==1 && len_s2==1)
     26     {
     27         printf("%d
    ",s1[0]-'0'+s2[0]-'0');
     28         return ;
     29     }
     30 
     31     for(i=len_s1-1, j=0; i>=0; i--)   //将字符数组转化为数字数组,并倒数存放,作为第一个加数 
     32 
     33     {
     34 
     35         num1[j] = s1[i] - '0';
     36 
     37         j++;
     38 
     39     }
     40 
     41     for(i=len_s2-1, j=0; i>=0; i--)   //将字符数组转化为数字数组,并倒数存放,作为第二个加数 
     42 
     43     {
     44 
     45         num2[j] = s2[i] - '0';
     46 
     47         j++;
     48 
     49     }
     50 
     51     
     52 
     53     for(i=0; i<=M; i++)               //实现大数的加法 
     54 
     55     {
     56 
     57         num1[i] = num1[i]+num2[i];
     58 
     59         if(num1[i]>9)
     60 
     61         {
     62 
     63             num1[i] = num1[i]-10;
     64 
     65             num1[i+1]++;     
     66 
     67         }    
     68 
     69     }
     70 
     71     
     72 
     73     for(i=M-1; i>=0&&num1[i]==0; i--);  //求得最终结果的位数 
     74 
     75     
     76 
     77     if(i>0)
     78 
     79     {
     80 
     81         for(; i>=0; i--)                    //最终答案的输出 
     82 
     83         {
     84 
     85             printf("%d", num1[i]);    
     86 
     87         }
     88 
     89     }
     90 
     91     else 
     92 
     93         printf("0");
     94     printf("
    ");
     95     return ;
     96 
     97 }
     98 
     99 
    100 void jian(char str_a[M],char str_b[M])
    101 
    102 {
    103 
    104       // 字符数组的初始化 
    105 
    106     int num_a[M];            // 被减数数组 
    107     memset(num_a,0,sizeof(num_a));
    108     int num_b[M];            // 减数数组 
    109     memset(num_b,0,sizeof(num_b));
    110     int num_c[M];                  // 差值数组 
    111     memset(num_c,0,sizeof(num_c));
    112     int len_a, len_b;              // 被减数位数,减数位数 
    113 
    114     int i, j, k, n, f=0;
    115 
    116     
    117 
    118     //scanf("%s %s", str_a, str_b);
    119 
    120     
    121 
    122     len_a = strlen(str_a);
    123 
    124     len_b = strlen(str_b);
    125 
    126     
    127 
    128     //K的值是参与运算的数据最大位数 
    129 
    130     if(len_a>len_b)
    131 
    132         k = len_a;
    133 
    134     else 
    135 
    136         k = len_b;    
    137 
    138     num_c[0] = 0;
    139 
    140         
    141 
    142     //n>0表示a>b, n<0表示a<b, n=0表示a=b 
    143 
    144     if(len_a > len_b)
    145 
    146         n = 1;
    147 
    148     else if(len_a == len_b)
    149 
    150         n = strcmp(str_a, str_b);
    151 
    152     else 
    153 
    154         n = -1;
    155 
    156         
    157 
    158     //字符数组倒序后位数对齐存在整数数组中 
    159 
    160     for(i=len_a-1, j=0; i>=0; i--, j++)
    161 
    162     {
    163 
    164         num_a[j] = str_a[i] - '0';    
    165 
    166     } 
    167 
    168     for(i=len_b-1, j=0; i>=0; i--, j++)
    169 
    170     {
    171 
    172         num_b[j] = str_b[i] - '0';    
    173 
    174     }    
    175 
    176  
    177 
    178     //具体执行减法运算 
    179 
    180     for(i=0; i<k; i++)
    181 
    182     {
    183 
    184         if(n>=0)
    185 
    186         {
    187 
    188             if(num_a[i]-num_b[i] >= 0)
    189 
    190                 num_c[i] = num_a[i] - num_b[i];
    191 
    192             else 
    193 
    194             {
    195 
    196                 num_c[i] = num_a[i] + 10 - num_b[i];
    197 
    198                 num_a[i+1]--;
    199 
    200             }
    201 
    202         }
    203 
    204         else 
    205 
    206         {
    207 
    208             if(num_b[i]-num_a[i] >= 0)
    209 
    210                 num_c[i] = num_b[i] - num_a[i];
    211 
    212             else
    213 
    214             {
    215 
    216                 num_c[i] = num_b[i] + 10 - num_a[i];
    217 
    218                 num_b[i+1]--;
    219 
    220             }
    221 
    222         }
    223 
    224     }
    225 
    226     
    227 
    228     //最终结果的输出 
    229 
    230     if(n<0)
    231 
    232         printf("-");
    233 
    234     for(i=k-1; i>=0; i--)
    235 
    236     {
    237 
    238         if(num_c[i])
    239 
    240             f=1;
    241 
    242         if(f||i==0)
    243 
    244             printf("%d", num_c[i]);
    245 
    246     }
    247 
    248     printf("
    ");
    249 
    250     return ;
    251 
    252 } 
    253 
    254 
    255 void cheng(char a[M],char b[M])
    256 {
    257     int x[M],y[M],z[N<<2];
    258     memset(x,0,sizeof(x));
    259     memset(y,0,sizeof(y));
    260     memset(z,0,sizeof(z));
    261         int l1,l2,i,j,k;
    262 
    263         memset(z,0,sizeof(z));
    264 
    265         l1=strlen(a),l2=strlen(b);
    266 
    267         for(j=0,i=l1-1;i>=0;i--)
    268 
    269             x[j++]=a[i]-'0';
    270 
    271         for(j=0,i=l2-1;i>=0;i--)
    272 
    273             y[j++]=b[i]-'0';
    274 
    275         for(i=0;i<l1;i++)
    276 
    277             for(j=0;j<l2;j++)
    278 
    279                 z[i+j]+=x[i]*y[j];
    280 
    281         for(k=0;k<l1+l2-1;k++)
    282 
    283             if(z[k]>=10)
    284 
    285             {
    286 
    287                 z[k+1]+=z[k]/10;
    288 
    289                 z[k]%=10;
    290 
    291             }
    292 
    293         for(i=k;i>0;i--)
    294 
    295         {
    296 
    297             if(z[i]==0)
    298 
    299                 continue;
    300 
    301             else
    302 
    303                 break;
    304 
    305         }
    306 
    307         for(;i>=0;i--)
    308 
    309             printf("%d",z[i]);
    310 
    311         printf("
    ");
    312 
    313 
    314     return ;
    315 
    316 }
    317 int main()
    318 {
    319     char ss1[M],ss2[M],ch;
    320     while(~scanf("%s %c %s",ss1,&ch,ss2))
    321     {
    322         if(ch=='+')
    323         {
    324             jia(ss1,ss2);
    325         }
    326         else if(ch=='-')
    327         {
    328             jian(ss1,ss2);
    329         }
    330         else if(ch=='*')
    331         {
    332             cheng(ss1,ss2);
    333         }
    334         }
    335         //printf("%s %c %s",ss1,ch,ss2);
    336     return 0;
    337 }
    338 
    339  
    340 
    341  
    View Code
  • 相关阅读:
    棋盘问题 简单搜索DFS
    Equivalent Strings
    素数环
    LeetCode Maximum Product Subarray
    UVA 725 – Division
    矩形嵌套问题
    ACM最大子串和问题
    ACM装箱问题
    ACM田胫赛马
    ACM雷达安放问题
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/11629962.html
Copyright © 2020-2023  润新知