#include
#include
main()
{
int i,n;
for(i=2;i<=50;i++)
{
for(n=2;n<=(int)sqrt(i);n++) //for(n=2;n<=i;n++) i<=n条件结束判断
if(i%n==0) break;
f(n==(int)sqrt(i)+1) //其实这个条件判断是和上面的for并列的
printf("%d",i);
}
}区别一下两次循环。
你会发现你的做法明显效率更高。
给你举个例子来说明一下吧。
比如说16,我给你举的做法就得从2做到16,就是比较传统的做法。
但是你的只要从2做到4,明显高效了,为什么呢?
和2对应的是8
和3对应的是5多一点
和4对应的是4
和5对应的是3多一点
和6对应的是3不到一点
……
你有没有发现到后来做的其实已经和前面的重复了呢?
而这个重复的界限的就是开方后的4对吧
第二个问题
还是上面的例子吧
这里的这个条件其实是到最后的break或者说是到最后了没做成才做到这个条件的,只有加了1才会到后面一个数上去啊。
因为这个循环里做到了最后,所以要进入下一个数。
(这个是思路,一下子没明白也正常的)我当时也想了很久的
1 这里用到了数学对偶原理:当2是i的因子时,i/2必然也是i的因子,而2不是i的因子时,i/2必然也不是i的因子,所以尝试i的因子时只要尝试一半,另一半根据对偶原理具有同样结论。
2 当n一直不是i的因子时,可以顺利加到(int)sqrt(i)+1结束循环,此时将i作为素数打印出来。
因为根号N之后 不可能会被i整除 (过程很麻烦,记住结论就行了)
因为如果是素数 ,那么for(n=2;n<=(int)sqrt(i);n++)
就会做到最后 那么n的值最后就变成了 (int)sqrt(i) 的后面一个数
(int)sqrt(i)+1
因为根号N之后
不可能会被i整除
(过程很麻烦,记住结论就行了)
因为如果是素数
,那么for(n=2;n<=(int)sqrt(i);n++)
就会做到最后
那么n的值最后就变成了
(int)sqrt(i)
的后面一个数
(int)sqrt(i)+1