c语言 大数加法、阶乘和乘法
标签:链接 strlen clu print arch 16px sea VID fine
一.大数加法
定义两个足够大的数字,其数值远超过long的取值范围,设该大数的位数有两百位,求其相加所得
大数加法的核心思想详见此链接,内有详细的动画演示,这里不再赘述
大数加法、大数阶乘
直接上代码:
#includestring.h>
#include#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//算法参考小学加法,这里定义一个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("\n");
}
后面抽时间更新阶乘和乘法
c语言 大数加法、阶乘和乘法
标签:链接 strlen clu print arch 16px sea VID fine
原文地址:https://www.cnblogs.com/oldfish123/p/13557317.html
评论