HDOJ HDU 1042 N!

来源:互联网 发布:excel密码破解软件 编辑:程序博客网 时间:2024/05/29 11:19

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 10000using 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;}  
原创粉丝点击