美文网首页工作生活
大数阶乘(N! Plus)问题

大数阶乘(N! Plus)问题

作者: Codeapes | 来源:发表于2019-06-30 10:38 被阅读0次

1.解题思路

将正整数N从1到N逐位相乘,即1 * 2 * 3...... * (N-1) * N。每次相乘后的值会存储到array[ ]中,其中一个数组元素中存储值中的一位数。当值小于10时直接存储,值大于10时,计算进位和本位,array[ j ]存储本位,array[ j+1 ]存储进位。
如:
10!= 3628800,有

array[7] = 3
array[6] = 6
array[5] = 2
array[4] = 8
array[3] = 8
array[2] = 0
array[1] = 0

2.样例输入

66

3.样例输出

544344939077443064003729240247842752644293064388798874532860126869671081148416000000000000000

4.代码实现

#include<stdio.h>
#define MAX 100000                // 若为10000,则会因缓存区小而溢出

int main()
{
    int numN = 0;                 // 正整数N
    while (scanf("%d",&numN) != EOF)
    {
        if (numN < 1 || numN >= 10000)
        {
            break;
        }
        
        int array[MAX] = {0};   
        array[1] = 1;            // 从array[1]开始
        int point = 1;           // point表示位数,刚开始只有一位array[1] 且 array[1] = 1,不能为0,0乘任何数为0
        int carry = 0;           // carry表示进位数,刚开始进位为0
        int j = 0;

        for (int i = 2; i <= numN; i++)     // N的阶乘
        {
            for (j = 1; j <= point; j++)    // 循环array[],让每一位都与i乘
            {
                int temp = array[j] * i + carry;    // temp变量表示不考虑进位的值
                carry = temp / 10;                  // 计算进位大小
                array[j] = temp % 10;               // 计算本位值
            }
            // 处理最后一位的进位情况
            // 由于计算数组的最后一位也得考虑进位情况,所以用循环讨论
            // 因为可能最后一位可以进多位;比如 12 * 本位数8,可以进两位
            while(carry)                        // 当进位数存在时,循环的作用就是将一个数分割,分割的每一位放入数组中
            {
                array[j] = carry % 10;
                carry = carry / 10;
                j++;                            // 表示下一位
            }
            point = j - 1;                      // 由于上面while中循环有j++,所以位会多出一位,这里减去
        }
        
        for (int i = point; i >= 1; i--)        // 逆序打印结果
        {
            printf("%d", array[i]);
        }
    }
}

个人小站:

www.codeapes.cn

相关文章

  • 大数阶乘(N! Plus)问题

    1.解题思路 将正整数N从1到N逐位相乘,即1 * 2 * 3...... * (N-1) * N。每次相乘后的值...

  • SICP——构造程序抽象(三)

    1.线性的递归和迭代 先从阶乘的问题入手,计算n的阶乘(n!),也就是: n!=n*[(n-1)*(n-2)*(n...

  • JavaScript pratice2

    问题描述: 计算所提供整数的阶乘。如果使用字母n代表一个整数,则阶乘是所有小于或等于n的整数的乘积。阶乘通常简写成...

  • java学习笔记之递归

    问题一:求n的阶乘:n! = n(n-1)!;n! = n(n-1)(n-2)....32*1; 方案一:便利 方...

  • 高精度整数——2. N的阶乘

    清华大学研究生复试n的阶乘问题 题目描述 输入一个整数n,输出n的阶乘(每组测试用例可能包含多组数据,请注意处理)...

  • 递归函数调用

    阶乘 举个例子,我们来计算阶乘 n! = 1 * 2 * 3 * ... * n,用函数 fact(n)表示,可以...

  • y combinator: 不引用自己也能实现递归?

    问题 递归函数,比如求阶乘:f = ->(n){ n==0? 1 : n*f[n-1] }这里右边引用了f,可以不...

  • java中的递归与迭代

    1.递归 如这个阶乘函数:n!=n*(n-1)*(n-2)*...*1计算阶乘的方法有很多。 一种方法是n!=n*...

  • 阶乘(n!)

    n! ,读作n的阶乘,表示从1到n的连续整数相乘之积。举个栗子:

  • 蓝杯九

    /*阶乘计算 问题描述 输入一个正整数n,输出n!的值。其中n!=1*2*3*…*n。算法描述n!可能很大,而计算...

网友评论

    本文标题:大数阶乘(N! Plus)问题

    本文链接:https://www.haomeiwen.com/subject/krwvcctx.html