虚心请教

bianchenglangzi_110 2009-12-16 10:27:12

int i, j;
for (i = 2; i < 100; i++)
{
for (j = 2; j <i / 2; j++)
{
if (i % j == 0)
break;
}
if (j > i / 2)
Console.WriteLine("质数: " + i);
}

请教哪位解释一下这个求质数的算法呀
尤其是for (j = 2; j <= i / 2; j++) 为什么是j<=i/2
还有j>i/2这个
先多谢各位了
...全文
152 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
colin_liying 2009-12-16
  • 打赏
  • 举报
回复
检查从2到n-1的数能否被n整除,能就不是质数,反之就是素数,这样做当然是正确的,但是浪费了一些没有必要的检查,其实只要检查从2到sqrt(n)之间的数就可以了,因为如果一个数有因子的话,那么它必定有一个因子不大于该数的平方根。
public static void PrimeNum(int maxNum)
{
for (int i = 3; i <= maxNum; i++)
{
bool IsPrime = true;
for (int j = 2; j <= Math.Sqrt(i); j++)
{
if (i % j == 0)
{
IsPrime = false;
break;//有因子证明是合数,马上退出循环。
}
}
if (IsPrime)
{
Console.Write(i.ToString()+" ");
}
}
}
babyofbaby 2009-12-16
  • 打赏
  • 举报
回复
其实i/2都浪费了,循环到sqrt(i)就可以了,这样效率更高,尤其是范围很大的时候,i/2和sqrt(i)的运算量就会差很多
  • 打赏
  • 举报
回复
等待高手回答
woshifou 2009-12-16
  • 打赏
  • 举报
回复
数学问题。
killernan 2009-12-16
  • 打赏
  • 举报
回复
這個代碼寫的有點別扭,判斷是不是質數就是看它有沒有因子
江南小鱼 2009-12-16
  • 打赏
  • 举报
回复
数学啦
for (j = 2; j < i / 2; j++) 为什么是j <i/2
质数:如果一个数只能被1和其本身整除,则这个数是质数。
那么,i除以从2开始到i-1的数,如果均不能整除,则说明该数是质数。
画一个坐标轴(横轴表数除数,纵轴表数商),然后绘点连线,你会得到一条最大值是i/2无限靠近一的一条平滑曲线。也就是说在i/2之后的点取值范围在1和2之间。
所以说如果一个数i不能被2和i/2之间的数整除,那么他一定不可以被i/2到1之间的数整除,之后就是循环到i/2的原因。

j>i/2 也即是for (j = 2; j <i / 2; j++)
{
if (i % j == 0)
break;
}
循环不满足条件跳出,此时j的值一定是大于i/2的。

其实,你可以这样子写:

int i, j;
bool bl=false;
for (i = 2; i < 100; i++)
{
for (j = 2; j <i / 2; j++)
{
if (i % j == 0)
{
bl=true;
break;
}
}
if (!bl)
Console.WriteLine("质数: " + i);
}
kolosi 2009-12-16
  • 打赏
  • 举报
回复
不是啥好算法,别研究了。
wanghui0380 2009-12-16
  • 打赏
  • 举报
回复
折半法

原因 A*B=B*A 所以只做一半的判断就成
数据之巅 2009-12-16
  • 打赏
  • 举报
回复
如果除到 A/2 了还不行的话,肯定就是质数了啊。。
比如 13 ,除到 6 了,再除7的话,肯定要小于2啊,也就是只能等于1,而质数的定义就是,只能被自己和1整除。
ztenv 2009-12-16
  • 打赏
  • 举报
回复
纯数学问题,要好好学下数学。。。
波导终结者 2009-12-16
  • 打赏
  • 举报
回复
一个数A能被B整除,则A/B还可以得到一个C,且B和C肯定有一个数分布在A/2的一侧,所以只要除到A/2就行了
wanghui0380 2009-12-16
  • 打赏
  • 举报
回复
11楼的错了,又有误导之嫌疑了

实际上Math.Sqrt(i)的效率并不高,你这样出来的结果 实际比lz本身的代码 运行效率还要低

正确的做法是
j*j <i

结论参考博客园 有道难题-完全立方数的 大讨论

111,120

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧