您的位置:程序门 -> java -> j2se / 扩展类



求1到100的阶乘和,谁来帮忙调试下?


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


求1到100的阶乘和,谁来帮忙调试下?[已结贴,结贴人:lcb530]
发表于:2007-09-30 09:21:13 楼主
import   java.math.biginteger;

public   class   demosum{

public   static   void   main(string[]   args){

biginteger   result   =   new   biginteger("1");
biginteger   bi   =   new   biginteger("1");

for(int   i=1;i <=100;i++){
bi   =   getresult(new   biginteger(""+i));
result.add(bi);
system.out.println   (result);
}
}

public   static   biginteger   getresult(biginteger   i){
if(i.equals("1")){
return   new   biginteger("1");
}
return   i.multiply(getresult(i.divide(new   biginteger("1"))));

}
}


它出现了死循环.
发表于:2007-09-30 09:56:531楼 得分:0
if(i.equals("1"))

这个条件不会满足,一个是biginteger   ,一个字符串


不要用递归,用循环好了
发表于:2007-09-30 10:25:502楼 得分:0
直接循环撒
发表于:2007-09-30 10:34:173楼 得分:0
lz的代码哪儿有问题呢?

发表于:2007-09-30 11:58:414楼 得分:0
1.1楼说的没错"if(i.equals("1"))   这个条件不会满足,一个是biginteger   ,一个字符串   "
2.   i.multiply(getresult(i.divide(new   biginteger("1"))));  
3.直接循环不就好了吗
发表于:2007-09-30 12:07:325楼 得分:0
支持一楼的
发表于:2007-09-30 12:38:426楼 得分:0
把这个   if(i.equals("1"))   改了   if(i.equals(1))也不对
自己随便写了个,数字太大时有错
望各位大虾们指教一二
public   static   void   main(string[]   args)   {
long   result   =   0;
long   tmp   =   1;
int   i;
for(i   =   1;   i   <=   100;   i++)   {
tmp   *=   getmul(i);
result   +=   tmp;
system.out.println(i+"的阶乘:"+tmp);
}
system.out.println("1到"+(i-1)+"的阶乘之和:"+result);
}

private   static   long   getmul(int   num)   {
return   1   *   num;
}
改为double倒不会出错
发表于:2007-10-01 22:10:417楼 得分:0
个人认为,算到100!基本类型的数据长度都不够的,可以用数据结构进行定义,把它们分为几部分来装这个大数(100!),并制订好它们之间的运算和进位关系。
发表于:2007-10-02 01:44:388楼 得分:0
我觉得用数组比较好,这样循环好控制
发表于:2007-10-02 01:47:239楼 得分:0
7楼正解!
发表于:2007-10-02 08:25:4310楼 得分:0
import   java.math.biginteger;

public   class   biginttest   {

        public   static   void   main(string[]   args)   {
        biginteger   t   =   biginteger.one;
        biginteger   r   =   biginteger.zero;
                for(int   i   =   1;   i   <=   100;   i++)   {
                t   =   t.multiply(new   biginteger(string.valueof(i)));
                r   =   r.add(t);
                }
                system.out.println(r);
        }
}
发表于:2007-10-02 08:27:0011楼 得分:0
结果是:
942690016837099792608598341244735398720707226139826724
429383593056246782234795060234002940935991364669866091
24347432647622826870038220556442336528920420940313
发表于:2007-10-02 10:10:3812楼 得分:0
阶乘不是乘法吗?
为什么要用r.add()?
这道题我以前做过,ms结果比楼上给出的要长。
发表于:2007-10-02 10:15:5013楼 得分:0
题目是求阶乘和,我的理解是先算阶乘再求和:
=1!+2!+3!+...+100!
发表于:2007-10-02 10:18:1814楼 得分:0
结果直接从eclipse里copy的,没有验证过,但是用1到5的阶乘和验证过代码
发表于:2007-10-02 10:35:4715楼 得分:0
-_-!!

我错了,刚才算了一下,100!的结果是:93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000
没你的长。
sorry!: ¦
发表于:2007-10-03 18:38:1216楼 得分:0
我自己改正后的答案是这样的:

import   java.math.biginteger;  

public   class   demo   {  
     
        public   static   void   main(string[]   args)   {  
        biginteger   r   =   biginteger.zero;  
                for(int   i   =   1;   i     <=   100;   i++)   {  
                 
                  r   =   r.add(getresult(i));  
                }  
                system.out.println(r);  
        }  
       
        public   static   biginteger   getresult(int   atr){
       
        biginteger   t   =   biginteger.one;  
        biginteger   rx   =   biginteger.zero;  
        for   (int   i   =   1;   i <=atr;   i++){
        t   =   t.multiply(new   biginteger(string.valueof(i)));  
        rx=rx.add(t);
        }
        return   rx;
        }
}


它的结果是:
95221410216348484495220122088890777516830189
30970614840888493645111490125520863186034184
18617044362540240315555410978265358075712570
12200675989420962514971614
发表于:2007-10-04 10:08:0817楼 得分:0
lz你自己改正后的代码还是有问题,把
for(int   i   =   1;   i       <=   100;   i++)   {
换成
for(int   i   =   1;   i       <=   3;   i++)   {
计算3的阶乘和来验证,得到的输出结果是13,但是1!   +   2!   +   3!   =   1   +   (1   x   2)   +   (1   x   2   x   3)   =   1   +   2   +   6   =   9
这道题如果用递归的话,正确的代码应该是:

import   java.math.biginteger;

public   class   biginttest2   {

public   static   void   main(string[]   args)   {
biginteger   r   =   biginteger.zero;
for   (int   i   =   1;   i   <=   100;   i++)   {
r   =   r.add(getresult(i));
}
system.out.println(r);
}

public   static   biginteger   getresult(int   atr)   {

biginteger   t   =   biginteger.one;
//biginteger   rx   =   biginteger.zero;
for   (int   i   =   1;   i   <=   atr;   i++)   {
t   =   t.multiply(new   biginteger(string.valueof(i)));
//rx   =   rx.add(t);   //t里面已经是atr的阶乘了,如果再加一遍,getresult的返回值就直接是阶乘和了,这一行应该去掉
}
return   t;
}
}

执行结果还是:
942690016837099792608598341244735398720707226139826724  
429383593056246782234795060234002940935991364669866091  
24347432647622826870038220556442336528920420940313
发表于:2007-10-05 09:03:4718楼 得分:0
昨天没仔细看,上面的版本不是用递归的,用递归实现的代码如下:

import   java.math.biginteger;

public   class   biginttest3   {

public   static   void   main(string[]   args)   {
biginteger   r   =   biginteger.zero;
for   (int   i   =   1;   i   <=   100;   i++)   {
r   =   r.add(getresult(i));
}
system.out.println(r);
}

public   static   biginteger   getresult(int   atr)   {
if   (atr   ==   1)   {
return   new   biginteger("1");
}   else   {
return   new   biginteger(string.valueof(atr)).multiply(getresult(atr   -     1));
}
}
}

执行结果同上
发表于:2007-10-07 12:43:2019楼 得分:0
package   demo;
import   java.math.biginteger;

public   class   demosun   {
public   static   void   main(string[]   args)   {

biginteger   bignum   =   new   biginteger("100");
system.out.print(factorial(bignum));
}

public   static     biginteger   factorial(biginteger   n)
{
if(n.equals(biginteger.one))
return   biginteger.one;
else
return   n.multiply(factorial(n.subtract(biginteger.one)));
}
}

正确运行:记得给分啊
运行结果:
9332621544394415268169923885626670049071596826438
1621468592963895217599993229915608941463976156518
286253697920827223758251185210916864000000000000000000000000
发表于:2007-10-07 12:44:5620楼 得分:0
郁闷啊,弄了才发现楼主没分啊,楼主不厚道啊,郁闷啊,苍天
发表于:2007-10-07 15:02:1221楼 得分:0
9426900168370997926085983412447353987207072261398267244293835
9305624678223479506023400294093599136466986609124347432647622
826870038220556442336528920420940313
发表于:2007-10-07 18:03:5922楼 得分:0
只要求出来的数字最好几位不是零的肯定是错了,竟然还把数字贴出来,不是程序编写问题,是常识问题,只可惜没分,唉,楼主啊
发表于:2007-10-07 18:06:2323楼 得分:0
只要求出来的数字最后几位不是零的肯定是错了,竟然还把数字贴出来,不是程序编写问题,是常识问题,只可惜没分,唉,楼主啊

----写了错别字,看来我要去小学语文重修了,把最后几位不是零的数字贴出来小学数学重修,呵呵,大家都一起重修小学去
发表于:2007-10-08 07:49:3024楼 得分:0
xiexie777,你的程序只算了阶乘,lz的题目是计算阶乘和,不一样的。

看仔细了再发言,比较不容易说错话
发表于:2007-10-14 15:33:5825楼 得分:0
谢谢worm_oz指出错误!

重新调试如下:

package   demo;

import   java.math.biginteger;

public   class   demosun   {
public   static   void   main(string[]   args)   {

biginteger   result   =   biginteger.zero;

for(int   i   =   1;i <=100;i++)
{
string   tempnum   =   i+"";
result   =   result.add(factorial(new   biginteger(tempnum)));

}

system.out.println(result);
}

public   static     biginteger   factorial(biginteger   n)
{
if(n.equals(biginteger.one))
return   biginteger.one;
else
return   n.multiply(factorial(n.subtract(biginteger.one)));
}


运行结果:942690016837099792608598341244735398720707226139
826724429383593056246782234795060234002940935991364669866
09124347432647622826870038220556442336528920420940313


快速检索

最新资讯
热门点击