class Demo
{
public static void main(String [] args)
{
add();
}
public static void add()
{
double num=1.0;
int x =1;
int y=1;
while(x<=20)
{
for(int i=1;i<=x;i++)
{
y*=i;
}
System.out.println(x+"+"+y);//这里给你加了一句话,看了一下在while循环之前y的值是如何变化的,
num +=1/y;//这里怎么报了除0错误!求大师指点!
x++;
}
System.out.println(num);
}
}
下面是运算的结果
1+1
2+2
3+12
4+288
5+34560
6+24883200
7+857276416
8+-511705088
9+1073741824//我们可以在这里看到,在for循环x是9的时候,y的值已经高达1073741824,当x等于10的时候,y的数值是那个数的平方,远远超出了int的取值范围,所以就变为了0
10+0
Exception in thread "main" java.lang.ArithmeticException: / by zero
at Demo.add(Demo.java:24)
at Demo.main(Demo.java:7)
请按任意键继续. . .
作者: 谭立文 时间: 2012-6-30 17:36
在这里给你提供了两种解决方案 第一种 :
public static void add()
{
double num=1.0;
int x =1;
while(x<=20)
{
long y = 1; //将 int y = 1; 定义为long型并放置在while循环里面
//比如说你求完 4的阶乘后 y = 1 * 2 * 3 * 4 = 24;按照你的思路重新利用循环
//来求5的阶乘 y * = i 如果y不重新置为1 那么求5的阶乘相当于求的是5 ! * 4 !
//20! = 2432902008176640000 如果你每次求完一个数后都没有重新将y置为1
//即时是long也不够用 所以会超出范围 而超过范围后系统会抛出异常并返回一个零值(这个是我自己用代码分析推断的
//所以1 / y 会提示除零错误 for(int i=1;i<=x;i++)
{
y*=i;
}
num +=1/y;//这里怎么报了除0错误!求大师指点!
x++;
System.out.println(y);
}
System.out.println(num);
}
其实这个代码的效率不是最高的,因为你求完5的阶乘求6的阶乘不需再重新重新1 * 2 * 3 * 4 * 5 * 6 只需要5的阶乘 * 6因为5的阶乘已经求过,根据这个思路我在最小限度改你代码并帮你完善了,希望对你有帮助。
public static void add()
{
double num = 1.0;
int x = 1;
long y = 1;
while (x <= 20)
{
y *= x;
num += 1 / y;// 这里怎么报了除0错误!求大师指点!
x++;
System.out.println(y);
}
System.out.println(num);
}作者: 罗磊 时间: 2012-6-30 22:22
哦哦!原来如此啊!谢谢各位大虾啊!