nyoj28大數階乘

大數階乘

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

 大數大樹傻傻分不清楚。。。

 學長說要做做大數~那就做好啦,先從之前做過的下手,小小的複習一下下~

 貼代碼

#include <stdio.h>
#include <stdlib.h>
#define MAX 20000
int num[MAX];
int main()
{
    int n;
    scanf("%d", &n);
    num[0] = 1;
    int i, j;
    for(i=1; i<=n; i++)       //最外層循環,從1乘到n
    {
        for(j=0; j<MAX; j++)    //num[0]存的是數字的最後一位,例如24則數組中存的是4,2
        {
            num[j] *= i;        //從最後一位,也就是相當於數的個位開始乘
        }
        for(j=0; j<MAX; j++)    
        {
            if(num[j] >= 10)    //從個位開始判斷是否有數字大於10,大於10就向數組的下一個即i+1進位
            {
                num[j+1] += num[j]/10;
                num[j] %= 10;
            }
        }
    }
    for(i=j-1; i>=0; i--)    //數組從後往前找到不是0的數的下標i
    {
        if(num[i] != 0)
            break;
    }
    for(j=i; j>=0; j--){         //從i開始輸出數組,也就是最後大數的階乘
        printf("%d", num[j]);
    }
    printf("\n");
return 0;
}
最優代碼

 
#include<iostream>
#include<iomanip>
using namespace std;
//存儲20000以內的階乘
int a[15470];
int main()
{
	//freopen("1.txt","r",stdin);
	//freopen("2.txt","w",stdout);
	int n;
	cin>>n;
	a[1]=1;
	a[0]=1;
	int up;
	for(int i=2;i<=n;++i)
	{
		up=0;
		for(int j=1;j<=a[0];++j)   //各個位相乘
		{
			a[j] *=i;
			a[j] +=up;
			up=a[j]/100000;
			a[j] %=100000;
		}
		if(up!=0)
		{
			a[0]++;
			a[a[0]]=up;
		}
	}
	if(a[0]==1) cout<<a[1];
		else
		{
			cout<<a[a[0]];
			for (int i=a[0]-1;i>0;i--)
			{
				cout<<setfill('0')<<setw(5)<<a[i];
			}
		}
}        



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