`
hulianwang2014
  • 浏览: 681059 次
文章分类
社区版块
存档分类
最新评论
  • bcworld: 排版成这样,一点看的欲望都没有了
    jfinal

大数阶乘Java实现

 
阅读更多

题目


描述
我们都知道如何计算一个数的阶乘,可是,如果这个数很大呢,我们该如何去计算它并输出它?
输入
输入一个整数m(0<m<=5000)
输出
输出m的阶乘,并在输出结束之后输入一个换行符
样例输入
50
样例输出
30414093201713378043612608166064768844377641568960512000000000000

思路:用data数组来存放阶乘的每一位数字,首先令第一位的数值为1,位数为1,然后将每次相乘的乘积存回数组,并循环处理每个数组中超过10的数,若数值超过10,则需要进位,将位数加1,原来的数除以10,商数加前一位数的数值后存回前一位数的数组中,再将余数存回原来位数的数组中。

例如求5!的值
步骤一:
1!=1
位数1
数组内容0 0 0 1
步骤二:
2!=2*1!=2
位数1
数组内容0 0 0 2
步骤三:
3!=3*2!=3*2=6
位数1
数组内容0 0 0 6
步骤四:
4!=4*3!=4*4=24
位数1
数组内容0 0 0 24
因为24大于10,需要进位
data[1]=data[1]+data[0]/10=0+2=2
data[0]=data[0]%10=4
所以数组内容为0 0 2 4
位数2
步骤五:
5!=5*4!=5*24=120
位数2
数组内容为0 0 2*5 4*5
即0 0 10 20
因为data[0]大于10,需要进位
data[1]=data[1]+data[0]/10=10+2=12
data[0]=data[1]%10=0
此时数组内容为0 0 12 0
data[2]=data[2]+data[1]/10=0+1=1
data[1]=data[1]%10=2
位数加1
数组内容为0 1 2 0
一次类推,可以计算大数的阶乘

代码如下:

import java.util.*;

public class Main {
	public static void main(String[] args)
	{
		Scanner input = new Scanner(System.in);
		int[] cal = new int[10010];
		int num = input.nextInt();
		cal[0] = 1;
		for(int index = 1; index <= num; ++index )
		{
			for(int i = 0; i < 10000; i++)
			{
				cal[i] = cal[i]*index;
				
			}
			for(int i = 0; i < 10000; i++)
			{
					cal[i+4] = cal[i+4]+ cal[i]/10000;
				cal[i+3] = cal[i+3]+ cal[i]%10000/1000;
				cal[i+2] = cal[i+2]+ cal[i]%1000/100;
				cal[i+1] = cal[i+1]+ cal[i]%100/10;
				cal[i+0] = cal[i]%10;
				
				
			}
		}
		for(int i3 = 0; i3 < 10004; i3++)
		{
			cal[i3+4] = cal[i3+4]+ cal[i3]/10000;
			cal[i3+3] = cal[i3+3]+ cal[i3]%10000/1000;
			cal[i3+2] = cal[i3+2]+ cal[i3]%1000/100;
			cal[i3+1] = cal[i3+1]+ cal[i3]%100/10;
			cal[i3+0] = cal[i3]%10;
			
		}
		
		int x = 10000;
		while(cal[x] == 0)
			x--;
		for(int i2 = x; i2 >= 0; i2--)
		{
			System.out.print(cal[i2]);
		}
		System.out.println();
		
		
		
	}
	

}


分享到:
评论

相关推荐

    Java版大数阶乘

    使用JAVA对大数进行编程,这个是一个源代码。

    大数阶乘完整Java代码

    大数阶乘,因为会出现溢出的问题,用数组存储阶乘结果,利用数组可以完美解决大数的阶乘。

    简单的java大数阶乘运算算法

    用java计算大数的阶乘,记得应该可以十秒内算出1000以内阶乘(时间很久了,大概是这样)。理论上是可以算无限大的数的阶乘的。可以作为程序设计实验课的作业。核心算法,没有赔UI。复制粘贴即可运行

    大数阶乘算法

    用java实现的大数阶乘的算法,理论上来说还有很多可以更新改进的地方。java自己的BigInteger0.031秒就完成了,本程序2.81秒完成。

    求大数的阶乘的算法(java)

    用java实现的求大数的阶乘 关键是用数组来存储计算结果

    用java实现10000的阶乘(2种方法)

    自己写的,原创,两个方法耗时不同,最基本通俗的大数阶乘方法

    大数阶乘问题

    大数阶乘!运用Java自带的类写的!这里是源代码的txt文档,只需建一个工程, 直接复制进去就行了!

    java 模拟手工运算1000的阶乘

    包含模拟手工算大数相加、大数相乘(大数=越位的数)

    SWT可视化插件

    非常好用的java swing拖拽插件,可以快速方便的开发Java桌面应用程序。

    简单大数运算

    java 大数N!计算1000的阶乘没什么问题

    求n大于20的阶乘值

    用递归来计算值,用字符数组来存储值(后面凑字数)

    50道JAVA基础编程训练+答案(全)

    大数阶乘、回文数、矩阵对角线元素之和、现输入一个数,要求按原来的规律将它插入数组中、杨辉三角形、字符串比较、809*??=800*??+9*??+1、0—7所能组成的奇数个数、一个偶数总能表示为两个素数之和、判断一个整数能...

    JAVA课后编程题.txt

    java基础经典题目及其代码整合,适合大二学习java基础的学生期末复习用,包括手机号\阶乘\字符串替换\设计一个矩形类Rectangle\找素数\大数整除等

    数值计算类程序

    3、支持:不确定稀疏矩阵的线性方程组求解、常规线性方程组求解、求任意一元函数的定积分问题、大数的加减乘除求余与阶乘、任意位数的2与10与16进制的转换、数据的插值、多项式的拟合、一元函数的多项式最佳平方逼近...

    FaktoryelCoWorker:用于极大数因子计算的协作分布式架构模型

    用于极大数因子计算的协作分布式架构模型最简单的形式,阶乘是将一个N整数乘以沿1 → N所有整数值得到的结果1 → N 在业务单元中使用阶乘过程进行分布式操作的原因是实现简单,CPU占用时间随着N数的增加而变高。...

    求解1!+2!+......+99!+100!

    利用大数求解1!+2!+......+99!+100!

    程序员为什么还要刷题-interviewquestions:面试问题

    为递归版本和迭代版本编写函数阶乘。 看 实现一种算法来验证二叉树是否已排序。 看 我有一个链表,可能有一个循环。 如何判断是否存在循环? 复杂度如何? 见 - O(1) 时间,O(n) 空间 我有两个不适合任何 Java 数字...

Global site tag (gtag.js) - Google Analytics