在某些情况下,我们必须处理位数相当多的一个整数,例如100位数,系统内建的资料型态不管是int、long?int、long?long?int等,位数显然都不够用。?要解决这个问题,我们必须自己用程式来处理,最简单的方法,就是模仿人工处理数字的方式,也就是把数字拆成一个位数一个位数,这个时候我们可以用一个阵列来完成这个动作。?不过,这样一来,所有对于这种超大整数的处理,包括输入一个大数、两个大数相加、印出一个大数等等,都需要我们自己写一个函数来处理。?至于这个阵列要用什么样的资料型态,因为两个一位数相乘也不过才81,所以我们可以用?char?的阵列来记录一个超长整数,如:
char?n[300];
就可以记录300位数的资料。?前面提到大数的输入及输出,都需要我们自己写函数来处理,我们分别把它们定名为?Input()?及?Print()?:
1?#include?<stdio.h>??
2?#include?<string.h>??
3?#define?LEN?3004?int??Input(?char??n[])??
5?{??
6?}??
7?void??Print(??n[])??
8?{??
9?}??
10??main()??
11?12???a[LEN];??
13??Input(a);??
14??Print(a);??
15?}??
上面第三行?#define?LEN?300?的意思,即是定义一个常数叫做?LEN?,而它的值是300,下面用到LEN的地方,在执行的时候便会自动变成300。?这样写的好处是,如果我们有好个地方都用到300这个数字,但是后来发现不够用了,要将它改成1000,这个时候要一行一行改,还可能不小心漏掉,如果用?#?define?定义一个常数,则只要改一个地方就行了。?接下来我们看到Input()函数要做的步骤:
1?把该阵列的每一格数字归零。
2?将使用者输入的数字以字串方式存到另一个字串。
3?计算该字串的长度。
4?从该字串的尾端(即个位数)开始一个一个位数往左,将它转换成数字后,存到阵列对应的格子中。
我们把上面提到的字串及超长整数的阵列做一个比较:
字串 |
s[0] |
s[1] |
s[2] |
s[3] |
s[4] |
s[5] |
s[6] |
s[7] |
s[8] |
s[9] |
'1' |
'2' |
'3' |
'4' |
'5' |
'6' |
0 |
× |
× |
× |
? |
阵列 |
n[0] |
n[1] |
n[2] |
n[3] |
n[4] |
n[5] |
n[6] |
n[7] |
n[8] |
n[9] |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
0 |
?