在自学中,有这样一道题,1!+2!+3!+……+30!这个题让我想了很长时间,而且查了很多的资料,开始的时候自己用递归的方法写出了一个数的阶乘,但是不知道怎么将它全部加起来,又查资料,一看很简单嘛!就实现如下的程序:
package com.lianxi;
public class jiecheng {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
long sum=0;
for(int i=1;i<=10;i++){
sum=sum+fun(i);
}
System.out.println(sum);
}
public static long fun(int num)
{
if(num==1||num==0){
return 1;
}else{
return (num*fun(num-1));
}
}
}
但是做到30 的阶乘时,输出的数就是负数了,我又晕了,好吧!查资料,说是long的数值范围是-9223372036854775808到9223372036854775807,最后的数超出了这个数,有没有办法了,肿么办?上网查资料吧!看到博客园的一篇文章专门说阶乘数据溢出的事,一看,哇!太晕,看不懂啊!但是看不懂怎么办了,好吧!收藏下来吧!就转载到了我的博客里了,但是收藏还是不能解决实际问题啊!只好有查资料,最后好不容易解决了这个问题?
package com.lianxi;
import java.math.*;
/**
*
* @author Administrator
*/
public class jiecheng5
{
public int aa[]=new int [100];
public int b=0;
public void chushihua()
{
for(int x=0;x<100;x++)
{
aa[x]=x+1;
}
}
public void jiecheng()
{
BigInteger cc[]=new BigInteger[100];
BigInteger d;
BigInteger e;
d=BigInteger.valueOf(0);
for(int x=0;x<30;x++)
{
cc[x]=BigInteger.valueOf(aa[x]);
}
for(int x=2;x<30;x++)
{
for(int y=2;y<aa[x];y++)
{
e=BigInteger.valueOf(y);
cc[x]=cc[x].multiply(e);
}
System.out.println(cc[x]);
}
for(int x=0;x<30;x++)
{
d=d.add(cc[x]);
}
System.out.println(' ');
System.out.println(' ');
System.out.println("阶乘和是:"+d);
}
public static void main(String[] args)
{
jiecheng5 bb=new jiecheng5();
bb.chushihua();bb.jiecheng();
}
}
最后问题是解决了,但是我从中学到了什么呢?总结一下,当数据大到溢出long时,怎么来处理,用BigInteger来处理。
package com.lianxi;
public class jiecheng {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
long sum=0;
for(int i=1;i<=10;i++){
sum=sum+fun(i);
}
System.out.println(sum);
}
public static long fun(int num)
{
if(num==1||num==0){
return 1;
}else{
return (num*fun(num-1));
}
}
}
但是做到30 的阶乘时,输出的数就是负数了,我又晕了,好吧!查资料,说是long的数值范围是-9223372036854775808到9223372036854775807,最后的数超出了这个数,有没有办法了,肿么办?上网查资料吧!看到博客园的一篇文章专门说阶乘数据溢出的事,一看,哇!太晕,看不懂啊!但是看不懂怎么办了,好吧!收藏下来吧!就转载到了我的博客里了,但是收藏还是不能解决实际问题啊!只好有查资料,最后好不容易解决了这个问题?
package com.lianxi;
import java.math.*;
/**
*
* @author Administrator
*/
public class jiecheng5
{
public int aa[]=new int [100];
public int b=0;
public void chushihua()
{
for(int x=0;x<100;x++)
{
aa[x]=x+1;
}
}
public void jiecheng()
{
BigInteger cc[]=new BigInteger[100];
BigInteger d;
BigInteger e;
d=BigInteger.valueOf(0);
for(int x=0;x<30;x++)
{
cc[x]=BigInteger.valueOf(aa[x]);
}
for(int x=2;x<30;x++)
{
for(int y=2;y<aa[x];y++)
{
e=BigInteger.valueOf(y);
cc[x]=cc[x].multiply(e);
}
System.out.println(cc[x]);
}
for(int x=0;x<30;x++)
{
d=d.add(cc[x]);
}
System.out.println(' ');
System.out.println(' ');
System.out.println("阶乘和是:"+d);
}
public static void main(String[] args)
{
jiecheng5 bb=new jiecheng5();
bb.chushihua();bb.jiecheng();
}
}
最后问题是解决了,但是我从中学到了什么呢?总结一下,当数据大到溢出long时,怎么来处理,用BigInteger来处理。