欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

蓝桥杯练习 《阶乘计算》如何处理大数乘法

程序员文章站 2022-05-12 13:40:55
...

题目描述:

蓝桥杯练习 《阶乘计算》如何处理大数乘法

思路:

阶乘级别的增长非常恐怖,当n等于1000的时候,位数就达到了2568,明显int和long long 都存不下,只能通过数组的方式进行存储。
原题描述:
 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法。使用一个数组A来表示一个大整数a,A[0]表示a的个位,A[1]表示a的十位,依次类推。
  将a乘以一个整数k变为将数组A的每一个元素都乘以k,请注意处理相应的进位。
  首先将a设为1,然后乘2,乘3,当乘到n时,即得到了n!的值。

  • 根据描述,最重要的一点就是,当某位数超出9的时候需要进位,可以联想实际中通过草稿纸是如何计算乘法的。

代码如下:

#include <stdio.h>
void carryBit(int j,int result[]){
    //判断是否大于9,若大于则进位
    if(result[j]>9){
        //上位加上整除的结果,本位保留余数
        result[j+1]+=result[j]/10;
        result[j]%=10;
        //因为上位加上数字以后很有可能也超过九,还需对上位进行进位
        //可通过递归调用本函数进行
        carryBit(j+1,result);
    }else{
        //递归出口,上位或本位不再大于8
        return;
    }
}
int main()
{
    //n的阶乘,先输入n
    int n;
    scanf("%d", &n);

    //因为得到的结果非常大,通过计算器得知大概有2600位
    //为了方便存储,我们将result[0]作为个位,以此往后,并将结果先设置为1
    int result[2601] = {1, 0};
    //计算过程 i代表从2到n依次相乘的数
    for (int i = 2; i <= n; i++)
    {
        //每一位都需要乘以i,这里需要从最高位开始乘,因为
        //如果从低位开始的话,进上来的数还要被再乘一次,导致结果错误
        //语言表达能力有限,可能不是很好理解,建议自己试一下。
        for (int j = 2600; j >= 0; j--)
        {
            result[j] *= i;
            //如果该位结果最后大于9,则需要进位,可通过一个函数实现
            carryBit(j,result);
        }
    }
    //输出结果 需要从最高位输出
    for(int i=2600;i>=0;i--){
        //从找到第一个不是0的数开始输出
        if(result[i]!=0){
            for(int j=i;j>=0;j--){
                printf("%d",result[j]);
            }
            printf("\n");
            break;
        }
    }
    return 0;
}
相关标签: 蓝桥杯

上一篇: 大数阶乘

下一篇: C课后作业