大数加减乘模板

大数加法:

  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\n",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("\n");
 97
 98     return 0;
 99
100 }
101
102  

大数减法:

  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("\n");
162
163     return 0;
164
165 }
166
167  

大数乘法:

 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("\n");
68
69     }
70
71     return 0;
72
73 }

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

  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\n",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\n",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("\n");
 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("\n");
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("\n");
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  

原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/11629962.html

时间: 2024-10-29 18:06:47

大数加减乘模板的相关文章

字符串大数加减运算问题

这里自己利用STL模板中的容器和链表实现字符串大数加减运算. 1 #include<iostream> 2 #include<vector> 3 #include<list> 4 using namespace std; 5 6 list<char> Input_Number(list<char> ilist)//输入链表字符串,以‘#’作为结束符 7 { 8 cout<<"please Input string ,end

POJ 2756 Autumn is a Genius 使用string的大数加减

本题就是说一个小神童,能计算加减法. 不过题目知识说这个小神童,到底有多神,要我们自己发现. 因为最后给出的数据非常非常巨大,听说接近50k就是超过50000个数位相加,可想而知他多神. 看来题目也是考IQ啊! 如果以为是超级水题,按照一般加减法做,肯定是WA了. 这里给出使用string的加减法运算,因为string是长度可增可减的,所以不管是多少位,只要内存支持,那么本算法都可以支持了.也可以使用vector这些容器.不过string应该更加省点内存. 注意: POJ比较讨厌的就是不支持C+

大数加减1——将两个数均前后倒置,以对齐最低位

#include <stdio.h> //将读入的数据存储到num[1]~num[x]中,num[0]表示存入数据的长度. void read(int num[]) { int i; char ch; for (i = 0; i<500; i++) num[i] = 0; i = 1; while ((ch = getchar()) != '\n') { num[i] = ch - '0'; i++; num[0]++; } } //将数据num[]中的数翻转,以便计算 void rev

常见的编程问题(一)少大数加减

存储区的概念 常见的存储区域可分为: 栈 由编译器在需要的时候分配,在不需要的时候自动清除的变量的存储区.里面的变量通常是局部变量.函数参数等. 堆 由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete.如果程序员没有释放掉,程序会一直占用内存,导致内存泄漏,在程序结束后,操作系统会自动回收. 由malloc等分配的内存块,它和堆是十分相似的,不过它是用free来释放分配的内存. 全局/静态存储区 全局变量和静态变量被分配到同一块内存中,在

【算法】大数加减

超长的整型加减法可以用数组int来存储,每个单元可以存储1~9位数字,然后模拟手算过程 大数乘除法,稍复杂,(挖坑)续更.. ====================分割线==================== 1 /************************************************* 2 Copyright: CheerM 3 Author: CheerM 4 Date: 2016-11-02 5 Description: 实现超长int型的加减运算.输入任意长

大数加减乘法

大数的相关计算问题一直是编程比赛常考的题目,在蓝桥杯比赛之前又把大数的加减乘法做了一遍.大数除法比较难,还没有去尝试实现,以后有机会了再继续补全好了. 算法分析:三种方法相似,都是按位操作,动态存储.处理好输入数据后,对每一位的逐个操作,很容易得到答案. 大数加法 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #define MAX 1010 using n

大数加减运算

1 #include<iostream> 2 #include<string> 3 4 using namespace std; 5 6 void BDplus(string str1, string str2) 7 { 8 int len1 = str1.length(); 9 int len2 = str2.length(); 10 char *value = NULL; 11 if (len1 >= len2) 12 { 13 //value= (char*)mallo

SPOJ VLATTICE - Visible Lattice Points 【“小”大数加减】

题目链接 一道比较简单的莫比乌斯反演,不过ans会爆long long,我是用结构体来存结果的,结构体中两个LL型变量分别存大于1e17和小于1e17的部分 #include<bits/stdc++.h> using namespace std; typedef long long LL; const int maxn=1e6; int prime[maxn+5]; bool check[maxn+5]; int mu[maxn+5]; void init() { mu[1]=1; int t

矩阵基本操作(加减乘、求逆、转置)

看模板,寻找的最好理解,最好用的矩阵基本操作的模板 #define MAXN 100 #define zero(x) (fabs(x)<1e-10) struct mat { int n,m; double data[MAXN][MAXN]; }; ///矩阵加减乘 int add(mat& c,const mat& a,const mat& b) { int i,j,k; if (a.m!=b.m||a.n!=b.n) return 0; c.n=a.n; c.m=a.m;