
JAVA求素数:for(j=2;j<=i/2;j++):是什么意思?为什么i/2,为什么没有“{”?
publicclassBreakDemo{publicstaticvoidmain(String[]args){inti,j,n=0;for(i=3;i<=100;i++...
public class BreakDemo{
public static void main(String[] args){
int i,j,n=0;
for(i=3;i<=100;i++){
for(j=2;j<=i/2;j++)
if(i%j==0)break;
if(j>=i/2+1){
if(n%6==0)
System.out.println("\n");
System.out.println(i+"");
n++;
}
}
}
}
当i=3时,2<=1,所以第二个for语句什么都不做了.是吧?? j没有自加,是吧? 展开
public static void main(String[] args){
int i,j,n=0;
for(i=3;i<=100;i++){
for(j=2;j<=i/2;j++)
if(i%j==0)break;
if(j>=i/2+1){
if(n%6==0)
System.out.println("\n");
System.out.println(i+"");
n++;
}
}
}
}
当i=3时,2<=1,所以第二个for语句什么都不做了.是吧?? j没有自加,是吧? 展开
展开全部
如上所述,不加{}的for的循环体只有后面紧接的一句,
为什么是i/2,就是i的一半(呵呵貌似白说了哈),当i的一半赋给一个整型的数时,或i/2被当成一个整型的数使用时,它一半就是去掉小数后的数(向下取整,比如5的一半,就当是2)
因此,算法大致的意思是这样,一个3到100的数,如果这个数,都不能被2到这个数的一半的数整除的话,就是素数
------------以下是对补充问题的回答------------------------
第一个if,当i能被j(一个2到i一半的整数)整除的时候,跳出for(j=2;j<=i/2;j++){}循环体,当然for(j=2;j<=i/2;j++){}循环体什么也没做,就一个劲的判断,当判断到有的场合时跳出,没有的话,j递增,然后继续循环
直到循环结束都没出现当i能被j(一个2到i一半的整数)整除的场合时,也跳出循环体,而j的值在结束时加1,刚好大过或等于(i的一半加1)。
而i在以上的两种情况跳出的场合,性质是不一样的,第一种是非素数,第二种是素数,所以进行
第二个if,假如for(j=2;j<=i/2;j++){}循环体是在循环还没结束时跳出的,值必定小于(i的一半加1),就什么也不做,反之,是在循环结束时跳出的,那就是素数,就进行打印,
第三个if,没用{}那么只影响下一句,效果就是每6个素数就分别多用一行空行格开,纯粹格式不用在意
当然,如楼上,所说可以用i的平方根代替,可以减少检验次数
可能没说清楚,可能啰嗦了点,呵呵,希望对你有帮助!
-------------------------------对补充的回答
这两天没上网XD,是的,没有自增
为什么是i/2,就是i的一半(呵呵貌似白说了哈),当i的一半赋给一个整型的数时,或i/2被当成一个整型的数使用时,它一半就是去掉小数后的数(向下取整,比如5的一半,就当是2)
因此,算法大致的意思是这样,一个3到100的数,如果这个数,都不能被2到这个数的一半的数整除的话,就是素数
------------以下是对补充问题的回答------------------------
第一个if,当i能被j(一个2到i一半的整数)整除的时候,跳出for(j=2;j<=i/2;j++){}循环体,当然for(j=2;j<=i/2;j++){}循环体什么也没做,就一个劲的判断,当判断到有的场合时跳出,没有的话,j递增,然后继续循环
直到循环结束都没出现当i能被j(一个2到i一半的整数)整除的场合时,也跳出循环体,而j的值在结束时加1,刚好大过或等于(i的一半加1)。
而i在以上的两种情况跳出的场合,性质是不一样的,第一种是非素数,第二种是素数,所以进行
第二个if,假如for(j=2;j<=i/2;j++){}循环体是在循环还没结束时跳出的,值必定小于(i的一半加1),就什么也不做,反之,是在循环结束时跳出的,那就是素数,就进行打印,
第三个if,没用{}那么只影响下一句,效果就是每6个素数就分别多用一行空行格开,纯粹格式不用在意
当然,如楼上,所说可以用i的平方根代替,可以减少检验次数
可能没说清楚,可能啰嗦了点,呵呵,希望对你有帮助!
-------------------------------对补充的回答
这两天没上网XD,是的,没有自增
展开全部
for(j=2;j<=i/2;j++)
if(i%j==0)break;
如果循环体里面只有一个语句,JAVA里面是可以不用写大括号将循环语句括起来的。这个是SUN定好的,尽管是个超级不推荐的坏习惯(但是不是错误的从语法角度上)
至于为什么只判断到i/2,这个有个基本定理的,检验素数只要判断自己一般范围内的约数个数。狠容易理解,如果一半范围内有一个能整除的数字,那么必定有一个数字在1~ i内也是它的约数。不符合素数规定。所以只需要检验到i/2,更快的可以只验证到这个数字的平方根, Math.sqrt(25.0)
即就是 for(j = 2; j <= Math.sqrt(i); j++);
if(i%j==0)break;
如果循环体里面只有一个语句,JAVA里面是可以不用写大括号将循环语句括起来的。这个是SUN定好的,尽管是个超级不推荐的坏习惯(但是不是错误的从语法角度上)
至于为什么只判断到i/2,这个有个基本定理的,检验素数只要判断自己一般范围内的约数个数。狠容易理解,如果一半范围内有一个能整除的数字,那么必定有一个数字在1~ i内也是它的约数。不符合素数规定。所以只需要检验到i/2,更快的可以只验证到这个数字的平方根, Math.sqrt(25.0)
即就是 for(j = 2; j <= Math.sqrt(i); j++);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
for(j=2;j<=i/2;j++)
if(i%j==0)break;
这个的意思就是for的循环体只有下边紧跟着的一句,所以就不需要{}了,但如果你循环体是二个;以上的,就必须有{},if也是可以这样写的,但大部分人为了分清层次就都加上了,但这样不写也是JAVA认可了的. 如果还有什么不知道的可以HI我.
if(i%j==0)break;
这个的意思就是for的循环体只有下边紧跟着的一句,所以就不需要{}了,但如果你循环体是二个;以上的,就必须有{},if也是可以这样写的,但大部分人为了分清层次就都加上了,但这样不写也是JAVA认可了的. 如果还有什么不知道的可以HI我.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这其实是一个简化型写法,当循环内的代码只需要一行就能写完,在for括号后紧跟着这行代码就可以了。
不仅仅是for,其他的判断语句例如if也是可以这么写的。
个人推荐以后的学习与工作中还是老老实实把该写的符号都补充完整,虽然看起来不够优雅,但起码更容易看懂,也不容易出错。
不仅仅是for,其他的判断语句例如if也是可以这么写的。
个人推荐以后的学习与工作中还是老老实实把该写的符号都补充完整,虽然看起来不够优雅,但起码更容易看懂,也不容易出错。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
顶4楼,不错
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询