ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

大数阶乘(N! Plus)问题

2019-12-24 21:54:28  阅读:213  来源: 互联网

标签:10 存储 大数 int Plus 阶乘 array numN 进位


解题思路

将正整数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

样例输入

66

样例输出

544344939077443064003729240247842752644293064388798874532860126869671081148416000000000000000

代码实现

#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]);
        }
    }
}

标签:10,存储,大数,int,Plus,阶乘,array,numN,进位
来源: https://www.cnblogs.com/codeapes666/p/12093741.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有