在各种语言中,很多东西都是不一样的,但是数字大小限制都是一样的。也就是说,溢出,是一个让所有程序员都头疼的东西。
大整数加减法,也就是为了解决过大的数字无法计算而生的。这里,我以一本通中的1168、1169题做例子,做一下C++中的大整数加减法。
大整数加法
头文件引用以及定义等
1 2 3 4 5 6 7
| #include <iostream>//绝不用万能头! #include <cstdio>//No More cin&cout #include <cstring>
#define MAX 10000
using namespace std;
|
Step One:输入
我们在这里用字符串进行输入储存,用gets()
函数进行输入,并且获取其长度。
代码如下:
1 2 3 4 5
| char in_a[MAX],in_b[MAX]; gets(in_a); gets(in_b);
int lena = strlen(in_a),lenb = strlen(in_b);
|
Step Two:数据转存
由于希望直接加减计算,我们将字符串数组倒序转存到初始化为零的整型数组当中。
倒序转存是为了我们从个位算起更方便。
代码如下:
1 2 3 4 5 6 7 8
| int a[MAX],b[MAX]; memset(a,0,sizeof(a)); memset(b,0,sizeof(b));
for(int i = 0;i < lena;i++) a[lena - i] = in_a[i]; for(int i = 0;i < lenb;i++) b[lenb - i] = in_b[i];
|
要注意,我们转存后的a
和b
是从a[1]
和b[1]
开始的。
Step Three:加法主程序
首先,我们需要定义一个数组来储存结果、两个变量分别储存进位和结果的长度。
代码如下:
1 2
| int c[MAX],flag = 0;lenc = 1; memset(c,0,sizeof(c));
|
然后,开始加减。
代码如下:
1 2 3 4 5 6 7
| while(lenc <= lena||lenc <= lenb) { c[lenc] = a[lenc] + b[lenc] + flag; flag = c[lenc]/10; c[lenc] %= 10; lenc++; }
|
完成加的操作后,最后第一位可能会再进一位,此时我们就需要判断是否需要进位。
代码如下:
1 2 3 4
| if(flag) c[lenc] = 1; else lenc--;
|
Step Four:输出
要注意,我们的数组是倒序的,所以需要倒序输出。
代码如下:
1 2 3
| for(int i = lenc;i > 0;i--) printf("%d",c[i]); printf("\n");
|
完整程序
gayhub链接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| #include <iostream>//绝不用万能头! #include <cstdio>//No More cin&cout #include <cmath> #include <cstring>
#define MAX 10000
using namespace std;
int main(){ char in_a[MAX],in_b[MAX]; int a[MAX],b[MAX],c[MAX]; int lena,lenb,lenc; int flag = 0;
memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c));
gets(in_a); gets(in_b);
lena = strlen(in_a); lenb = strlen(in_b);
for(int i = 0;i < lena;i++) a[lena-i] = in_a[i] - '0'; for(int i = 0;i < lenb;i++) b[lenb-i] = in_b[i] - '0';
lenc = 1; while (lenc <= lena || lenc <= lenb) { c[lenc] = a[lenc] + b[lenc] + flag; flag = c[lenc]/10; c[lenc] %= 10; lenc++; }
if(flag) c[lenc] = 1; else lenc--;
for(int i = lenc;i > 0;i--) printf("%d",c[lenc]);
printf("\n"); system("pause"); return 0; }
|
到此,加法完成!
大整数减法
Step One:输入