(大数 万进制) 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 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

思路:

万进制:

这题也让我有了点想法。我们经常用的进制就是2进制、8进制、10进制和16进制。何来“万进制”?世上本无,有人喊了也就有了。呵呵

现在来谈谈自己对进制的一点不成熟的想法。计算机能“识别”0和1,人能识别0、1、2、3、4、5、6、7、8、9以及其多位组合。那么,

为啥就单单有2、8、10、16这几个进制。我想并不止这几个,10进制是我们日常生活沿用来了的,难道来个5进制就不行?当然不是,不过

一切以方便优先罢了!2进制是因为方便计算机识别才兴起的,5000年前应该不会有2进制!8进制和16进制又因何2进制有天然联系,所以

也出现了用途,2^3=8、2^4=16(例:这在《数字逻辑》中关于编码方面有相关应用)。

就题论题。再来谈谈1042的万进制。也以一个例子来说明:

107924372*15=1618865580。

①上面的乘法如果运用10进制,很简单。

②万进制呢?

首先存数:a[0]=4372,a[1]=792,a[2]=1。107924372,从低位到高位每四位存到一个数组元素中。此时,总位数为3。

接着运算:a[0]*15=65580,所以进位为a[0]/10000=6,a[0]=a[0]%10000=5580。a[1]*15=11880,a[1]=a[1]+6=11886。

进位为1,a[1]=1886。a[2]*15=15,a[2]=a[2]+1=16,进位为0。

输出:a[2],a[1],a[0]即为1618865580。要注意的是:如果a[2]=886,那么该如何输出?直接输出:168865580。显然不对,

正确的是16088655880。输出的原则是:最高位原样输出,其它位如果小于1000,则高位补0,一位一补。

总之,高精度计算阶乘一般用万进制。

#include<iostream>

#include<iomanip>

using namespace std;

void fac(int n)

{

int a[10001];

int carry=0,place=0,i,j;

a[0]=1;

for(i=1;i<=n;i++)

{

carry=0;

for(j=0;j<=place;j++)

{

a[j]=a[j]*i+carry;

carry=a[j]/10000;

a[j]%=10000;

}

if(carry>0)

{

place++;

a[place]=carry;

}

}

cout<<a[place];

for(i=place-1;i>=0;i--)

cout<<setw(4)<<setfill(‘0‘)<<a[i];

}

int main()

{

int n;

while(cin>>n)

{

fac(n);

cout<<endl;

}

return 0;

}

用java:

import java.math.BigInteger;

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner in = new Scanner (System.in);

        int n;

        while(in.hasNextInt()) {

            n=in.nextInt();

            BigInteger a=BigInteger.ONE;

            for(int i=1;i<=n;i++)

                a=a.multiply(BigInteger.valueOf(i));

            System.out.println(a);

        }

    }

}

原文地址:https://www.cnblogs.com/Weixu-Liu/p/9164596.html

时间: 2024-10-28 14:18:20

(大数 万进制) N! hdu1042的相关文章

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

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 ≤ 1

Java 大数任意进制转换

import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); String s = cin.nextLine(); int x = cin.nextInt(); int y = cin.nextInt(); System.out.println(Transform(s,x,y)); } //s:输入的数字 x:

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

[例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这样的大

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. 千进制的性

高精度的进制转换

1 #include <stdio.h> 2 #include <string.h> 3 4 char str[1000];//输入字符串 5 int start[1000],ans[1000],res[1000]; //被除数,商,余数 6 //res[]存的是余数,其最后结果的逆序为所求的结果 7 //转换前后的进制 8 const int oldBase = 10; 9 const int newBase = 2; 10 11 void change() 12 { 13 //

高精度进制转换

高精度进制转换: 对于普通的不是很大的数的相互转换,我们一般采用不断模取余的方法,例如:将10进制数m转换成n进制数,则对m模n取余即可.但是,如果是一个有几百.几千或者更多位的大数呢?显然这种模取余的方法不再适用了.那如何求解此类大数的转换呢?接下来,介绍一种通用方法. 我们将一个大数的每一位看做是一个单独的数,但是却不是完全孤立的,与其它位置上的数有关联,从该数的最高位开始,对该位上的数除以要转换的进制基数,得到商和余数,商取代原来该位上的数,进行下一位的相同操作,但是注意下一位的除数不仅仅

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