大数加减乘模板

Posted kongbursi-2292702937

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数加减乘模板相关的知识,希望对你有一定的参考价值。

大数加法:

技术图片
  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 #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

 

以上是关于大数加减乘模板的主要内容,如果未能解决你的问题,请参考以下文章

大数加减乘模板

大数模板(加减乘除幂次开方)

大数运算(加减乘除)

大数(高精度)加减乘除

大数运算实现加减乘除四则运算

c++实现大数加减乘除四则运算