您的位置:首页 > 其它

【清华机试】N!(0<=N<=1000)

2016-08-04 15:58 267 查看
#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
);
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐