大數階乘
- 描述
- 我們都知道如何計算一個數的階乘,可是,如果這個數很大呢,我們該如何去計算它並輸出它?
- 輸入
- 輸入一個整數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");
}