hdu1042 java_(大数 万进制) N! hdu1042

这篇博客探讨了如何使用万进制进行高精度计算,以解决大整数阶乘的问题。作者通过一个例子展示了如何将10进制转换为万进制进行计算,并给出了Java代码实现。在万进制下,计算阶乘可以避免溢出问题,提高了计算效率。文章还提出了对进制系统的思考,指出进制选择往往取决于实际需求和便利性。
摘要由CSDN通过智能技术生成

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

(这个题用JAVA更好)

b2b00ef4c1bda47015bf9782a48412b8.gif

4689443725d396736ae24e6e719da4cb.gif

用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);

}

}

}

View Code

这个思路是从其他博客上看到的。。。

思路:

万进制:

这题也让我有了点想法。我们经常用的进制就是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,一位一补。

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

b09ea11d883f59a1bffb0f992bfb7e98.gif

1ed2009d2c0c26bb1c4124494a95d00d.gif

#include

#include

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<

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

cout<

}

int main()

{

int n;

while(cin>>n)

{

fac(n);

cout<

}

return 0;

}

View Code

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值