日期:2014-05-20  浏览次数:20807 次

为什么调换boolean sign = true的位置结果却大不一样!!!
这是个找出101到200内质数的超级小菜例,呵呵还请大家帮下忙!!!
first:
public class TestSimple {
public static void main(String args[]) {
boolean sign = true;
for(int i=101;i<200;i+=2) {
for(int j=2;j<i;j++) {
if(i%j == 0) {
sign = false;
break;
}
}
if(!sign) {
continue;
}
System.out.print(i+" ");

}
}
}


second:
public class TestSimple {
public static void main(String args[]) {
for(int i=101;i<200;i+=2) {
boolean sign = true;
for(int j=2;j<i;j++) {
if(i%j == 0) {
sign = false;
break;
}
}
if(!sign) {
continue;
}
System.out.print(i+" ");

}
}
}

------解决方案--------------------
因为第一个里sign 被初始化一次,而在第二个里每次循环都初始化,建议看看变量的作用域的相关知识
------解决方案--------------------
放在循环体内每次都被赋值,当然不一样。
------解决方案--------------------
同意楼上,另外为什么不把判断是否是质数的过程封装成一个方法呢,程序看起来就好读的多了,下面是昨天为csnd的一个朋友写的你参考下.
/**
* @param args
*/
public static void main(String[] args) {


int num = Integer.parseInt(readSystemIn());
for (int i = 1; i <= num; i++) {
if (isPrime(i))
System.out.println(i);
}
}

/**
* 判断一个数是否是素数

* @param num
* @return
*/
private static boolean isPrime(int num) {
for (int k = 2; k <= num/2; k++) {
if (num % k == 0)
return false;
}
return true;
}

/**
* 从控制台读取一串字符串

* @return
*/
public static String readSystemIn() {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
return br.readLine();
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
------解决方案--------------------
两点:
一、像楼上各位说的一样,尽量写成面向对象的方式,容易阅读和检查

二、第一个程序写错了,第二个是对的,所以差别大。
第一个程序sign变量只在第一次赋值true。而第二个程序每次循环都将sign还原为true。
第一个程序如果碰到一个非质数,sign永远是false,后面的语句System.out.print(i+" "); 就永远不会执行了