c语言 大数加法、阶乘和乘法
一.大数加法
定义两个足够大的数字,其数值远超过long的取值范围,设该大数的位数有两百位,求其相加所得
大数加法的核心思想详见此链接,内有详细的动画演示,这里不再赘述
大数加法、大数阶乘
直接上代码:
#include<string.h> #include<stdio.h> #define N 10//定义当前一个足够大的数字为10位,可任意更改 void print_num(int a[],int n) { int i=n-1;//从逆序数组的最后一项开始查找,进行反逆序 while(a[i]==0)//由于规定的数组比真实计算的数字大,所以数组最后几位必定存在0的情况 --i;//这种情况下一定要将0舍去,否则会抬高数组的位数 for(;i>=0;i--)//找到非零的数组,进行反逆序输出 printf("%d",a[i]); } void plus(int num1[],int num2[],int n) {//尤其注意!由于数组是逆序的,所以num[0]是个位,num[1]是十位,num[2]是百位 for(int i=0,up=0;i<n;i++)//算法参考小学加法,这里定义一个up进位标记 { int temp=num1[i]+num2[i]+up;//up最开始设为0,因为在个位无法获取进位 num1[i]=temp%10;//若产生进位行为,则选取个位部分赋给num1 up=temp/10;//在个位上,若个位相加产生进位,则用temp/10取整加到下一次的十位上 } print_num(num1, n); } int main(){ char buffer1[]="123456";//缓冲数组,将当前数组倒序写入num1中 char buffer2[]="78951234";//同上,写入num2中 int num1[N]={0};//将num1,2全部置为0,用来将缓冲数组写入到num数组当中 int num2[N]={0}; int n=N;//定义上述两个数组的长度为10 for(int i=0,temp=(int)strlen(buffer1)-1;temp>=0;temp--) num1[i++]=buffer1[temp]-‘0‘;//用倒序的方式将缓冲数组写入num中,意味着num的第一位是个位,第二位是十位,三是百位... for(int i=0,temp=(int)strlen(buffer2)-1;temp>=0;temp--) num2[i++]=buffer2[temp]-‘0‘; plus(num1, num2, n);//将两数字相加 printf(" "); }