大數階乘

大數階乘

時間限制:3000 ms  |  內存限制:65535 KB
難度:3
描述
我們都知道如何計算一個數的階乘,可是,如果這個數很大呢,我們該如何去計算它並輸出它?
輸入
輸入一個整數m(0<m<=5000)
輸出
輸出m的階乘,並在輸出結束之後輸入一個換行符
樣例輸入
50
樣例輸出
30414093201713378043612608166064768844377641568960512000000000000

分析:這道題很早就學了,但是現在纔會做,着實丟人,才發現以前是自己沒有好好思考,寫篇博客,記錄下。

這道題重點在於拆分計算:開一個數組a[10000],用以前的乘法方式比如120乘以6,先把120的每一位存入數組,然後讓0與6相乘等於0存入a[0],2乘以6把餘數2存入a[1],1乘以6加上上一位的1存入a[3],這個就是結果。

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int s[20000];倒着存入到數組中
int main()
{
    int a,b,n;
    scanf("%d",&n);
    memset(s,0,sizeof(s));
    s[0]=1;
    for(int i=2;i<=n;i++)
    {
        int c=0;
        for(int j=0;j<20000;j++)//這裏其實還可以再優化一些,不用每次都計算這麼多位,
        {
            int a=s[j]*i+c;
            s[j]=a%10;
            c=a/10;
        }
    }
    for(int i=20000-1;i>=0;i--)
    {
        if(s[i])
        {
            b=i;//b是最後的有效位數
            break;
        }
    }
    for(int i=b;i>=0;i--)
        printf("%d",s[i]);倒着輸出
    printf("\n");
}

發佈了39 篇原創文章 · 獲贊 3 · 訪問量 5728
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章