计算机发明的初衷就是解决以人类计算能力无法有效解决的问题,这类问题包括反复多次的复杂运算也包括天文级数字的运算,但就c语言的初步学习可以发现,不论是int还是float乃至更大的unsigned long long int和double形式的数据都是有极限的。
一般形式的数据里最大的整型是unsigned long long int,极限为18446744073709551615,是10^19次方的数量级,就日常生活的问题可能足够了,但以计算机的计算能力而言远远不够,
那么对这样的数据,也就是我们俗称的大数进行操作就需要一种算法进行处理,也就是我们常说的----《大 数 四 则 运 算》。
一.大数的加法:
大数的运算,核心的思路就是用数字逐位储存数据,这样数字的空间大小就是能储存的最大位数,意味着只需要一个开一个大小为20的数组就可以储存比unsigned long long int类型更大的数据,在某些数据范围很大的情况下有不小的帮助。
大数的算法关键是进位的储存和处理,在这里我们选择的方法是使用中间变量来储存。
这是例子,方便理解:
#include<stdio.h>
#include<string.h>
int main(void)
{
char a[1000],b[1000]; //声明字符数组储存输入的大数
int sum[1001]= {0}; //声明一个数组储存结果并讲改数组初始化
int num1[1000]= {0},num2[1000]= {0}; //声明两个数组用于储存转换后的大数
int n,c=0; //声明一个计数变量n,和进位时使用的变量
scanf("%s",a); //录入两个大数
scanf("%s",b);
int i,i1,i2,len; //声明若干变量用于循环计数和储存大数位数
i1=strlen(a); //获取位数
i2=strlen(b);
len=(i1>i2)?i1:i2; //获取较大的位数
for(i=i1-1,n=0; i>=0; i--) //将数据处理成整型方便计算(可省略,在后续计算时同时进行)
{
num1[n]=a[i]-'0';
n++;
}
for(i=i2-1,n=0; i>=0; i--)
{
num2[n]=b[i]-'0';
n++;
}
for(i=0; i<len; i++) //开始计算,将末尾数据储存在首位sum[0]下标逐次+1
{ //结果取模运算得个位数,并加上次计算所得进位数
sum[i]=num1[i]+num2[i]+c;
sum[i]=sum[i]%10;
c=(num1[i]+num2[i]+c)/10; //c取十位数作为进位
}
if(c!=0) //判断最大位数是否进位
printf("%d",c); //若进位则输出进位数
for(i=len-1; i>=0; i--) //倒序输出的sum即为所求大数相加之和
printf("%d",sum[i]);
return 0;
}
这是一个稍微复杂一些的大数加法模板,一些步骤在熟练后是可以简化整合的,但是便于理解我们先这样写,大数加法的关键在于进位的处理,
包括最高位若是进位则如何处理,以及如何取得进位以及如何储存各位,想明白了这是一个很实用也很简单的思路。
浙公网安备 33010602011771号