HDU1042 N!(大数问题,万进制)

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=1042

N!

Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 89320    Accepted Submission(s): 26376

Problem Description

Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N!

Input

One N in one line, process to the end of file.

Output

For each N, output N! in one line.

Sample Input

1
2
3

Sample Output

1
2
6

分析:

采用万进制

万进制原理如下:

比如:107924372*15=1618865580。

四位一分,所以a[0]=4372,a[1]=790,a[2]=1;

a[0]*15=4372*15+0(低位的进位)=65580,所以进位为65580/10000=6,余数为65580%10000=5580,a[0]=5580

a[1]*15=792*15+6(低位的进位)=11886,所以进位为11886/10000=1,余数11886%10000=1886,[1]=1886

a[2]*15=1*15+1(低位的进位)=16,所以进位为16/10000=0,余数16%10000=16,a[2]=16

所以结果为a[2]a[1]a[0]=16 1886 5580

如果a[1]=886的话,不满足四位,要在高位补0,那么这个时候的结果为:16 0886 5580

只有最高位在不满足四位的情况不需要补0,其余都需要

代码如下:

#include<bits/stdc++.h>
//采用万进制
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        int a[40000];
        int l=0;//位数
        a[0]=1;//初始化
        for(int i=1;i<=n; i++)//求阶乘
        {
            int c=0;
            for(int j=0; j<=l; j++)
            {
                a[j]=a[j]*i+c;//该位的结果:该位数字乘以i,再加上低位的进位
                c=a[j]/10000;//进位
                a[j]=a[j]%10000;//余数
            }
            if(c>0)//最后还是有进位的情况
            {
                l++;//位数加一
                a[l]=c;//进位直接赋值
            }
        }
        printf("%d",a[l]);//先输出最高位
        for(int i=l-1; i>=0; i--)
            printf("%04d",a[i]);//除最高位以外,每位不足4位的时候前面补0
        printf("\n");
    }
}

原文地址:https://www.cnblogs.com/yinbiao/p/8732611.html

时间: 2024-10-09 20:14:16

HDU1042 N!(大数问题,万进制)的相关文章

(大数 万进制) N! hdu1042

N! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Total Submission(s): 88267    Accepted Submission(s): 26008 Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in o

hdu-1042(大数+万进制)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1042 参考文章:https://blog.csdn.net/tigerisland45/article/details/51530528 题意:求n!(n<=1000)数字很大,可以用万进制来做,就是到了10000就进一,每个数字用数组存储. #include<iostream> #include<cstdio> #include<cstring> using nam

poj3708 扩展中国剩余定理+大数转d进制

#include<cstdio> #include<cstring> using namespace std; #define ll long long #define pf printf #define sf scanf const int maxn=1000+5; int d,in1[maxn],in2[maxn],inm[maxn],ink[maxn],a[maxn],b[maxn]; void tran(int *ten,int len,int &newlen,in

高精度计算(四):大整数乘法(采用“万进制”)

[例1]大整数乘法. 编写一个程序,求两个不超过200 位的非负整数的积. (1)编程思路. 大整数乘大整数,实质就是在小学竖式乘法的基础上枚举各个乘数位与被乘数相乘,累加到结果当中.其中乘数中的第j位与被乘数中的第i位相乘时,结果应该保存到结果的第i+j-1位中. (2)源程序. #include <iostream>using namespace std;const int base=10000;const int maxlen=50+2;void charTobignum(char *c

大数进制转换问题

在数据结构课关于栈的这一章中,我们都学过用"模2取余法"来将一个10进制数转换为一个二进制数,进而可以推广到"模n取余法",经其转换为n进制(n任意指定). 确实,这是一个很基础的题目,可你是否想过如果这个10进制数是一个大数(其位数可能上千位,此时用一般数据类型肯定是会溢出的),那么这个问题又如何来求解呢? 当然,也许你会说很简单嘛,自己写一个大数类(当然至少要写一个大数除法才行),或者你用的是Java这种现代化语言,就更轻松了,直接用BigInteger这样的大

51NOD 1116 K进制下的大数(字符串取模 + 枚举)

传送门 1116 K进制下的大数 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 关注 有一个字符串S,记录了一个大数,但不知这个大数是多少进制的,只知道这个数在K进制下是K - 1的倍数.现在由你来求出这个最小的进制K. 例如:给出的数是A1A,有A则最少也是11进制,然后发现A1A在22进制下等于4872,4872 mod 21 = 0,并且22是最小的,因此输出k = 22(大数的表示中A对应10,Z对应35). Input 输入大数对应的字符串S

poj 2635 千进制

转自:http://www.cnblogs.com/kuangbin/archive/2012/04/01/2429463.html 大致题意: 给定一个大数K,K是两个大素数的乘积的值. 再给定一个int内的数L 问这两个大素数中最小的一个是否小于L,如果小于则输出这个素数. 解题思路: 首先对题目的插图表示无语... 高精度求模+同余模定理 1.  Char格式读入K.把K转成千进制Kt,同时变为int型. 把数字往大进制转换能够加快运算效率.若用十进制则耗费很多时间,会TLE. 千进制的性

poj2305-Basic remains(进制转换 + 大整数取模)

进制转换 + 大整数取模一,题意: 在b进制下,求p%m,再装换成b进制输出. 其中p为b进制大数1000位以内,m为b进制数9位以内二,思路: 1,以字符串的形式输入p,m; 2,转换:字符串->整数 十进制->b进制; 3,十进制下计算并将整形结果转换成字符串形式,并倒序储存; 4,输出.三,步骤: 1,输入p[],m[]; 2,字符串->整形 + 进制->b进制: i,进制转换语句:m2 = m2*b + m[j]-'0'; ii,大整数取模,大整数可以写成这样的形式: 12

hdu 1042 N!(大数阶乘,转化为100000这样的比较大的进制)

N! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 54172    Accepted Submission(s): 15365 Problem Description Given an integer N(0 ≤ N ≤ 10000), your task is to calculate N! Input One N in one