阶乘(factorial)是基斯顿·卡曼(Christian Kramp, 1760 – 1826)于1808年发明的运算符号。阶乘,也是数学里的一种术语。
任何大于1的自然数n阶乘表示方法:
n!=1×2×3×……×n
或
n!=n×(n-1)!
n的双阶乘:
当n为奇数时表示不大于n的所有奇数的乘积
如:7!!=1×3×5×7
当n为偶数时表示不大于n的所有偶数的乘积(除0外)
如:8!!=2×4×6×8
小于0的整数-n的阶乘表示:
(-n)!= 1 / (n+1)!
0!=1,注意(0的阶乘是存在的)
我们所说的阶乘是定义在自然数范围里的(大多科学计算器只能计算0~69的阶乘),小数没有阶乘,像0.5!,0.65!,0.777!都是错误的。
自然数就是我们常说的正整数和0。整数包括自然数
import java.util.Date;
public class Oldsl {
/**
* @param args
*/
public static void main(String[] args) {
long s=System.currentTimeMillis();
Oldsl.js(12);
long d=System.currentTimeMillis();
System.out.println(d-s);
// System.out.println(Oldsl.Jc(12));
// System.out.println(Oldsl.js(12));
}
public static int Jc(int n){
if(n<0){
return 0;
}
if(n<2&&n>=0){
return 1;
}
int result = 1;
if(n>=2){
for(int i=1;i<=n;i++){
result*=i;
}
}
return result;
}
public static int js(int n){
if(n<0){
return 0;
}
if(n<2&&n>=0){
return 1;
}
int result = 1;
if(n>=2){
result=n*js(n-1);
}
return result;
}
}
递归和循环性能分析:
public static void main(String[] args) {
int n=20;
long s=System.currentTimeMillis();
for(int i=1;i<5000000;i++){
Oldsl.Jc(n);
}
long d=System.currentTimeMillis();
System.out.println("循环时间"+(d-s));
long s1=System.currentTimeMillis();
for(int i=1;i<5000000;i++){
Oldsl.js(n);
}
long d1=System.currentTimeMillis();
System.out.println("递归时间:"+(d1-s1));
}
循环时间516
递归时间:1265
从计算结果可以看出,当计算量小的时候看不出来。随的计算量得增大,循环的性能要比递归高的多,所以尽量用循环,不用用递归。
如果该一下方法,用BigInteger来计算,看一下性能问题:
public static BigInteger Jc(int n){
BigInteger result = BigInteger.ONE;
if(n>=2){
for(int i=1;i<=n;i++){
BigInteger temp=new BigInteger(i+"");
result=result.multiply(temp);
}
}
return result;
}
long s1=System.currentTimeMillis();
for(int i=1;i<5000000;i++){
Oldsl.Jc(20);
}
long d1=System.currentTimeMillis();
System.out.println("时间:"+(d1-s1));
时间:44453
同样的循环次数,耗时就相当多,所以BigInteger性能不是很好
分享到:
相关推荐
下载之后使用轻松汇编打开之后,代码直接保存一下,然后在进行编译,以及后面的运行,输入的数据是0-9的数据,每次只能输入一个数据。如果想要实验多次的话,运行多次,输入不同的结果,然后分别进行截屏!
java阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘阶乘
Java 计算 100 的阶乘使用数组实现 在 Java 中,计算大数的阶乘是一项复杂的任务,因为 Java 的基本数据类型无法存储如此大的数字。为了解决这个问题,我们可以使用数组来存储和计算大数的阶乘。下面我们将详细介绍...
阶乘 阶乘计算 大数阶乘 大整数阶乘 用数组计算阶乘
为了提高效率,特别是在处理大数阶乘时,可以考虑使用`BigInteger`类,这是.NET框架提供的一种能处理任意大小整数的类型。以下是使用`BigInteger`的C#阶乘函数示例: ```csharp using System.Numerics; public ...
在编程实现阶乘计算时,我们可以使用循环或递归两种方法。循环方法通常更高效,因为它避免了递归带来的额外开销。以下是一个简单的Java实现: ```java public class Factorial { public static void main(String[]...
本例中作者使用了一种特殊的方法来“近似”计算100万的阶乘,通过计算对数的方式,避免了直接处理大数的问题。这种方法的核心思想在于:将阶乘的结果转换为对数形式,然后通过处理对数来间接得到阶乘的大致值。 ###...
java中使用递归方法计算阶乘的代码示例
本主题聚焦于使用C语言计算10的阶乘,这是一个基础但重要的算法问题,对于学习编程的初学者来说具有很高的实践价值。 阶乘是一个数学概念,表示一个正整数n的所有小于等于n的正整数的乘积,通常用“!”表示。例如...
- 在计算阶乘时,通常只需要使用整型变量(如`int`),但在本例中使用了`double`类型,这可能会导致精度损失。 - `sum`变量在这里的作用并不明确,因为阶乘通常只需要计算单个结果而不是累加所有中间结果。如果目的...
阶乘求和是一个在计算机科学和数学中常见的问题,它涉及到序列的计算和求和。在本问题中,我们关注的是从1到n的所有整数的阶乘的总和。阶乘是一个数与小于等于它的所有正整数的乘积,表示为n!。例如,5! = 5 × 4 ×...
本篇将详细讲解如何使用VB实现递归来求解阶乘。 阶乘是一个数学概念,表示一个正整数n的所有小于等于n的正整数的乘积,通常用n!表示。例如,5的阶乘(5!)是5 × 4 × 3 × 2 × 1 = 120。递归求阶乘就是利用函数...
本主题聚焦于如何使用双向链表这一数据结构来实现大数阶乘的计算。双向链表允许我们有效地存储和操作大数,同时保持良好的性能。 首先,我们需要了解双向链表的基本概念。双向链表是一种线性数据结构,其中每个节点...
阶乘是基斯顿·卡曼(Christian Kramp,1760~1826)于 1808 年发明的运算符号,是数学术语。 一个正整数的阶乘(factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。1808年,...
在这个主题中,我们将深入探讨如何使用C#编程语言实现阶乘计算。C#是一种面向对象的、类型安全的、现代的编程语言,由微软开发,广泛应用于Windows桌面应用、Web应用以及游戏开发等领域。 首先,让我们理解阶乘的...
### 不要被阶乘吓倒(各种阶乘) 阶乘是一个数学中常见的概念,表示一个正整数的所有小于及等于该数的正整数的乘积。阶乘通常用符号 "!" 表示,例如 5! = 5 × 4 × 3 × 2 × 1 = 120。阶乘在计算机科学、组合数学...
本例中,"用双向链表做的n的阶乘"是一个将这两个概念结合的程序,使用C语言编写,并能在Visual Studio 2005环境下编译运行。通过双向链表来存储阶乘过程中产生的中间结果,这可能是因为链表在动态添加和删除元素时比...
在编程中,我们可以使用两种基本方法来计算阶乘和: 1. **循环法**:通过循环结构遍历1到n的每个整数,逐个计算每个数的阶乘并将它们累加。这种方法直观易懂,但计算效率较低,尤其是对于较大的n值,阶乘的增长速度...
在C#中实现n的阶乘,我们可以使用循环或递归两种方法。本文将深入探讨这两种方法,并给出相应的代码示例。 首先,我们需要了解阶乘的定义:一个正整数n的阶乘(表示为n!)是所有小于及等于n的正整数的乘积,0的阶乘...