求1000的阶乘

重o0o生 2009-04-11 07:50:20
加精
如何算出1000的阶乘
...全文
6268 212 打赏 收藏 转发到动态 举报
写回复
用AI写文章
212 条回复
切换为时间正序
请发表友善的回复…
发表回复
bl724 2011-11-19
  • 打赏
  • 举报
回复
算大数阶乘,只能算到1493,代码:

Scanner in = new Scanner(System.in);
System.out.println("请输入非负整数:n=");
int num = in.nextInt();

int length = 1;
double result = 0;

//log10(1000!)=log10(1)+log10(2)+log10(3)+log10(4)+log10(5)+....log10(1000)
for (int i = 1; i <= num; i++) {
result += Math.log10(i);
}
length += result; //计算结果有多少位——100-999为三位
System.out.println(length);

int[] res = new int[length]; //定义一个长度和结果的长度一样长的数组,每个元素保存结果的每个位的树
res[0] = 1; //1的阶乘默认为1
for (int i = 1; i <= num; i++) {

int temp = 0; //保存逢十进位的进位数
for (int j = 0; j < length; j++) {
res[j] *= i; //上一结果的每个位上的数和当前数相乘
res[j] += temp; //加上下一位数与当前数相乘的结果的进位数
temp = 0; //进位数清零

if (res[j] > 10) {
temp = res[j] / 10; //保存进位数
res[j] %= 10; //每个位上的数与当前数相乘的结果大于10,只取结果的个位数保存
}
}
}

System.out.println(num + "的阶乘是:");
for (int i = length; i > 0; i--) {
System.out.print(res[i-1]);
}
王铎开 2010-07-23
  • 打赏
  • 举报
回复
两种方式:FOR循环和JAVA 递归调用

public class Recursion{
public static int multiply(int n){
if(n==0||n==1){
return n;
}else{
return n*multiply(n-1);
}
}
public static void main(String args []) {
System.out.print(multiply(1000);)
}
}
andy2u 2010-04-15
  • 打赏
  • 举报
回复
这个要用到大整数的算法吧
xinguohit 2010-03-21
  • 打赏
  • 举报
回复
把代码也发上吧

import java.math.BigDecimal;
public class Test {
public static void main(String []args) {

BigDecimal bd = new BigDecimal(1);
for(int i=1000;i>0;i--)
{
bd = bd.multiply(new BigDecimal(i));
}
System.out.println(bd);
}
}

最终运算结果:
xinguohit 2010-03-21
  • 打赏
  • 举报
回复
Java提供了两个用于高精度计算的类:BigInteger和BigDecimal,大体上属于“包装容器类”的范畴,只是二者没有对应的基本类型。但这两个类包含的方法与对应的操作类型所能执行的操作相似,即能作用于int或float的操作,也同样能作用于BigInteger或BigDecimal。
其中,BigInteger支持任意精度的整数,也就是说,在运算中,可以精确地表示任何大小的整数值,而不会丢失任何信息。
BigDecimal支持任意精度的定点数,可以用它进行精确的货币计算。

只是,运算速度会比较慢,典型的以速度换精度。
hww6891 2010-03-21
  • 打赏
  • 举报
回复
学习中
jjw1206 2010-03-21
  • 打赏
  • 举报
回复
<html>
java55369618 2010-03-18
  • 打赏
  • 举报
回复

import java.math.*;
public class B {
public static void main(String[] args) {
B b=new B();
BigInteger a=b.t1(BigInteger.valueOf(1000L));
System.out.println(a);

}
public BigInteger t1(BigInteger a){
if(a.equals(BigInteger.valueOf(1L))){
return BigInteger.valueOf(1L);
}

return a.multiply(t1(a.subtract(BigInteger.valueOf(1L))));

}

}
bestaa 2010-03-09
  • 打赏
  • 举报
回复
infinity了吧,显示不出的,应该
Inhibitory 2010-02-10
  • 打赏
  • 举报
回复
空间效率都不高.
1万 * 1万 = 1亿.
10万 * 10万 = 100亿.
一个32位的int是介于1亿与100亿之间的2147483647(21.x亿),
所以用整形数组来存放结果时, 每个元素可以存放一个0-9999的数, 而不是只存放一个计算得到的位. 再使用大数乘法, 就可以解决这个问题.
漩涡 2010-02-03
  • 打赏
  • 举报
回复

99楼的那个
敢情上面的回复你白看了?
int整型放不下。。
Moritz 2010-02-01
  • 打赏
  • 举报
回复
任意数的阶乘均可计算:
import java.math.*;
import java.util.*;
public class Factorial
{
public static void main(String[] args) throws InputMismatchException
{
Scanner in = new Scanner(System.in);

System.out.println("请输入要计算阶乘的十进制非负整数:");
BigInteger n = in.nextBigInteger();
System.out.println("n = "+n);
BigInteger i = BigInteger.valueOf(1);
BigInteger result = n;
int m = -1;
for(i = BigInteger.valueOf(1); m == -1; i=i.add(BigInteger.valueOf(1)))
//while (m == -1)
{
System.out.println("i ="+i);//本行可去掉,不影响结果
result =result.multiply(n.add(i.negate()));
m = i.compareTo(n.add(BigInteger.valueOf(1).negate()));//将i与n-1作比较。若用m = i.compareTo(n);将i与n作比较将会出现(n!)=0的错误
}
System.out.println("n! ="+result);
}
}

huanok 2010-02-01
  • 打赏
  • 举报
回复
我觉得Java或者c++等高级语言可以添加一种科学计数法数据类型来解决这种问题
xin520huan 2010-01-23
  • 打赏
  • 举报
回复
呵呵,BigInteger是挺强大的!挺好!

不过不用的话,算出来的,真的是很牛x啊!!!
mutoujuelian 2010-01-22
  • 打赏
  • 举报
回复
一个阶乘引发的血案。。
借我那把枪吧 2010-01-04
  • 打赏
  • 举报
回复
都是高手高手高高手
gao11811 2009-12-11
  • 打赏
  • 举报
回复
37楼的代码有点价值,这个题目很明显考的是数据结构和算法,以及你的思路
如果纠结在类型上,那就已经算失败了
simon_1 2009-11-07
  • 打赏
  • 举报
回复
怎么都是c++代码
simon_1 2009-11-07
  • 打赏
  • 举报
回复
int 只能算到13的阶乘,再往上不够存啊。
java_util_Scanner 2009-06-30
  • 打赏
  • 举报
回复

package ArrayExample;

import ConsoleReader.ConsoleReader;

public class array04 {
public static void main(String args[]) {
int[] Data = new int[2569];
int Digit;
int i, j, k;
int N;

for (i = 1; i < 40; i++) {
Data[i] = 0;
}

Data[0] = 1;
Data[1] = 1;
Digit = 1;

System.out.print("请输入你想计算的数值(最大1000):");
ConsoleReader Console = new ConsoleReader(System.in);
N = Console.readInt();

for (i = 1; i < N + 1; i++) {
for (j = 1; j < Digit + 1; j++) {
Data[j] *= i;
}
for (j = 1; j < Digit + 1; j++) {
if (Data[j] >= 10) {
if (j == Digit) {
Digit++;
}
Data[j + 1] += Data[j] / 10;
Data[j] = Data[j] % 10;
}
}
}
System.out.print(N + "! = ");
for (k = Digit; k > 0; k--) {
System.out.print(Data[k]);
}
System.out.print("(" + Digit + "位数)");
System.out.println("");
}
}
加载更多回复(191)
101!=9425947759838359420851623124482936749562312794702543768327889353416977599316221476503087861591808346911623490003549599583369706302603264000000000000000000000000 102!=961446671503512660926865558697259548455355905059659464369444714048531715130254590603314961882364451384985595980362059157503710042865532928000000000000000000000000 103!=99029007164861804075467152545817733490901658221144924830052805546998766658416222832141441073883538492653516385977292093222882134415149891584000000000000000000000000 104!=10299016745145627623848583864765044283053772454999072182325491776887871732475287174542709871683888003235965704141638377695179741979175588724736000000000000000000000000 105!=1081396758240290900504101305800329649720646107774902579144176636573226531909905153326984536526808240339776398934872029657993872907813436816097280000000000000000000000000 106!=114628056373470835453434738414834942870388487424139673389282723476762012382449946252660360871841673476016298287096435143747350528228224302506311680000000000000000000000000 107!=12265202031961379393517517010387338887131568154382945052653251412013535324922144249034658613287059061933743916719318560380966506520420000368175349760000000000000000000000000 108!=1324641819451828974499891837121832599810209360673358065686551152497461815091591578895743130235002378688844343005686404521144382704205360039762937774080000000000000000000000000 109!=144385958320249358220488210246279753379312820313396029159834075622223337844983482099636001195615259277084033387619818092804737714758384244334160217374720000000000000000000000000 110!=15882455415227429404253703127090772871724410234473563207581748318444567162948183030959960131517678520479243672638179990208521148623422266876757623911219200000000000000000000000000

62,616

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧