大数加减乘除模板

大数加法:

  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
原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/11629962.html