一、了解大数加法
大数加法,顾名思义,就是对很大的数进行加法运算。
大数在不同的领域有不同的涵义,关于大数是说法有下面5种。
1. 交易员术语,指汇率的头几位数字。
2. 数学用语,指两个数中较大的数。
3.代表十的七十二次方.
4.大数在编程中表示超过32位二进制位的数.
5.命运注定的寿限。如在《东周列国志》第一回:“只见杜伯、左儒齐声骂曰:‘无道昏君!你不修德政,妄戮无辜,今日大数已尽,吾等专来报冤。还我命来!’”
在数学中,数值的大小没有上限,但是在计算机中,由于字长的限制,计算机所能表示的范围有限,对于很大的数,计算机无法对其进行直接计算,需要用到所谓的高精度算法,即用数组来存储整数,并模拟手算的方法进行四则运算。
二、计算机中实现大数加法的方法
当大数其位数超过计算机的数据类型的范围时,计算机无法对其进行直接计算,需要用到所谓的高精度算法,即用数组来存储整数。所以在进行大数加法运算时我们需要先定义两个数组分别来存储这两个大数。
通常,我们进行两个数的加法运算时,先将各位相加,若个位相加之后的和大于十,则需要向十位进一,然后再对十位进行相加,依次从后位往前位进行加法运算。
这里我们进行大数加法运算时同样也需要从末尾开始运算,所以我们可以使用循环先分别从存储两个大数的数组中依次从末尾到开始拿出个位、十位、百位......然后其对应的进行相加,再把结果存储到另一个新的数组中,最后将存储结果的数组中的元素倒序输出,其结果就是两个大数相加的结果。
三、程序代码
#include <stdio.h>
// 倒序字符串
void str_rts(char *s)
{
char*p=s;
while(*p) p++;
p--;
for(;s < p;s++,p--)
{
*p ^= *s;
*s ^= *p;
*p ^= *s;
}
}
char b[] =
"1283461973258176325874124\
35878032743712098317867293728651279";
char a[] =
"9080202033923787772398789\
50493849938744869530984603429835934";
char c[200];
int main()
{
char *pa = a;
char *pb = b;
//定义各位数的整型值存储
int ga,gb,gc,flag = 0;//flag 进位标志
int i = 0; //c中的存储位置
printf("a=%60s\nb=%60s\n",a,b);
//找到ab的末尾字符地址
while(*pa) pa++;
pa --;
while(*pb) pb++;
pb --;
//按位计算 从末尾开始
for(;a <= pa || b <= pb;pa--,pb--,i++)
{
if(pa >= a)//判断指针越界否
ga = *pa - '0';
else
ga = 0;//a 短于 b 补0
if(pb >= b)
gb = *pb - '0';
else
gb = 0;//b 短于 a 补0
gc = ga + gb + flag;
if(gc > 9)//判断是否进位
{
flag = 1;
gc %= 10;
}
else
{
flag = 0;
}
c[i] = gc + '0';
}
//判断溢出否
if(flag)
c[i++] = '1';
//给c添加结束符'\0'
c[i] = '\0';
//倒叙c
str_rts(c);
printf("c=%s\n",c);
printf("i=%d\n",i);
return 0;
}
四、运行结果