#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn = 3002; // 1000 的階乘約 2600 位
int a[maxn] = {0}; // 存儲 N 的階乘
char num[1002][maxn] = {0}; // 存儲每一個 N!
int main()
{
int i = 2; // 遍歷2-n
int j = 1;
int len = 1; // 數組長度,默認爲1
int count = 0; // 計數器
// 求解 1!~1000!, 空間換時間
a[1] = 1;
for(i = 2; i <= 1000; ++i)
{
// 每一位乘以i
for(j = 1; j <= len; ++j)
{
a[j] *= i;
}
// 移位
for(j = 1; j <= len; ++j)
{
if(a[j] > 9)
{
a[j+1] += a[j]/10;
a[j] %= 10;
// 處理高位進位
if(len == j)
{
len++;
}
}
}
// 不用過濾前面的0, len就指向的最高位
count = 0;
for(j = len; j >= 1; --j)
{
num[i][count++] = '0'+a[j];
}
num[i][count] = '\0'; // 存儲結尾的'\0'
}
int n;
while(cin >> n)
{
if(n == 0)
{
// 0!
cout << "1" << endl;
}
else
{
printf("%s\n", num[n]);
}
}
return 0;
}
【清華機試】N!(0
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.