计算机发明的初衷就是解决以人类计算能力无法有效解决的问题,这类问题包括反复多次的复杂运算也包括天文级数字的运算,但就c语言的初步学习可以发现,不论是int还是float乃至更大的unsigned long long intdouble形式的数据都是有极限的。

一般形式的数据里最大的整型是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;
 }

这是一个稍微复杂一些的大数加法模板,一些步骤在熟练后是可以简化整合的,但是便于理解我们先这样写,大数加法的关键在于进位的处理,

包括最高位若是进位则如何处理,以及如何取得进位以及如何储存各位,想明白了这是一个很实用也很简单的思路。