大数阶乘

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大数阶乘相关的知识,希望对你有一定的参考价值。

题目描述 

给定一个整数N(0≤N≤10000),求取N的阶乘

输入描述:

多个测试数据,每个测试数据输入一个数N

输出描述:

每组用一行输出N的阶乘
示例1

输入

1
2
3

输出

1
2
6
思路
刚开始看到这个题目,写了个直接乘过去的,是用long long 在提
交之前测了一下最大的数4000,程序输出0,稍微小
点的数字输出是负数,发现longlong完全不够用,后来我尝试使用数组去模拟乘法,但我最终还是没有写出来
于是翻看了这篇博客,他的程序非常巧妙,只使用了一个数组,于是我模仿着写了自己的程序
总结
先思考再动手,不要写到半路才发现行不通
#include <cstdio>
#include <iostream>
#include <cstdlib>
using namespace std;
#define INF 0x3f3f3f3f//可以用于memset
int num[40000];
int main()
{
    int n;
     while(cin>>n)
     {
         num[1]=1;
         int fla=1,carry=0,res;//fla记录这个大数的位数,carry记录上次乘法多余的部分
         for(int i=2;i<=n;i++)
         {
             for(int j=1;j<=fla;j++)
             {
                 res=i*num[j]+carry;
                 num[j]=res%10;
                 carry=res/10;
             }
             while(carry)
             {
                 fla++;
                 num[fla]=carry%10;
                 carry/=10;
             }
         }
         for(int i=fla;i>=1;i--)
            printf("%d",num[i]);
         printf("\n");
     }
    return 0;
}

 

以上是关于大数阶乘的主要内容,如果未能解决你的问题,请参考以下文章

大数的阶乘

题目1076:N的阶乘(大数乘法)

大数阶乘

nyoj 28-大数阶乘 (大数模板)

大数阶乘问题

大数阶乘