HDOJ 1042 N!
题目
点此查看 HDOJ 1042 N!
题意
求 N! (0 ≤ N ≤ 10000)
题解
典型大数问题
而且由于乘数不是大数
所以 模拟计算比较简单
用一个 int 表示 4为整数(要保证 相乘 小于 int(目前一般为32位)的最大值(2147483648)
将每一位对应相乘 加上上一次进位位 对 10000 取余 并记录下一次进位位 计算数 除以 10000
提示 10000! 大概要 36000位
直观感受 N! 增长
点击查看 1- 100 N! 表
代码
之前自己写的大数模板 总 WA
就贴这个拆分出来的吧
#include <stdio.h>
#define maxnum 10000
#define maxint 10000
using namespace std;
int main()
{
int i,j,r,m,cur;
while(scanf("%d",&r) != EOF)
{
if(r < 0)
continue;
int perint[maxnum] = {0};
perint[0] = 1;
m = 0;
for(i = 2;i <= r;i++)
{
for(int j = 0;j <= m;j++)
{
perint[j] *= i;
if(j > 0 && perint[j-1] > maxint)
{
perint[j] += (perint[j-1] / maxint);
perint[j-1] = perint[j-1] % maxint;
}
if(perint[m] >= 10000)
m++;
}
}
printf("%d",perint[m]);
for(int i = m - 1;i >= 0;i--)
printf("%04d",perint[i]);
printf("\n");
}
return 0;
}