c语言 大数加法、阶乘和乘法

2021-03-31 21:26

阅读:418

标签:链接   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


评论


亲,登录后才可以留言!