求100以内素数的算法解决办法
求100以内素数的算法
------解决方案--------------------
大于 平方根的 是 浪费,
------解决方案--------------------
肯定 没有 合适的了
------解决方案--------------------
举个很简单的例子你就明白了。
6
a. 6 / 1 = 6
b. 6 / 2 = 3
c. 6 / 3 = 2
d. 6 / 4 = 1.5
e. 6 / 5 = 1.2
f. 6 / 6 = 1
注意f项和a项,c项和b项事实上是等价的。
------解决方案--------------------
假设要判断的整数是n,它的平方根是m
很显而易见的是,当整数n能被比它的平方根m还大的另一个整数p整除时,整除所得到的商q肯定是小于它的平方根m的。
而在判断n是否是素数的循环值(即p值)是由小到大依次进行的,上面情况中的小于m的q值肯定在循环的初期已经判断过了,所以大于m的整数值的判断是多余的。
------解决方案--------------------
// Trunc(Sqrt(i)) 帮我解释下 为什么这里要平方根
减少运算量而已,
假设A=B*C(设B<C)
那么:
B<=Trunc(Sqrt(A)) 且 C>=Trunc(Sqrt(A))
------解决方案--------------------
减少运算量而已
但是最好用古老的筛素数法
比这个要快指数倍
------解决方案--------------------
------解决方案--------------------
- Delphi(Pascal) code
procedure TForm1.a; var X,Y : Integer; i,j :Integer; F : Boolean; begin mmo1.Lines.Clear; x:=0; Y:=100; if (x=0) or (x=1) or (x<0) then begin X:=2 end; for i:=X to Y do begin F:=True; for j:=2 to Trunc(Sqrt(i)) do // Trunc(Sqrt(i)) 帮我解释下 为什么这里要平方根 begin if (i mod j)=0 then begin F:=False; Next; end; end; if F then begin mmo1.Lines.Add(IntToStr(i)); end; end; end;
------解决方案--------------------
大于 平方根的 是 浪费,
------解决方案--------------------
肯定 没有 合适的了
------解决方案--------------------
举个很简单的例子你就明白了。
6
a. 6 / 1 = 6
b. 6 / 2 = 3
c. 6 / 3 = 2
d. 6 / 4 = 1.5
e. 6 / 5 = 1.2
f. 6 / 6 = 1
注意f项和a项,c项和b项事实上是等价的。
------解决方案--------------------
假设要判断的整数是n,它的平方根是m
很显而易见的是,当整数n能被比它的平方根m还大的另一个整数p整除时,整除所得到的商q肯定是小于它的平方根m的。
而在判断n是否是素数的循环值(即p值)是由小到大依次进行的,上面情况中的小于m的q值肯定在循环的初期已经判断过了,所以大于m的整数值的判断是多余的。
------解决方案--------------------
// Trunc(Sqrt(i)) 帮我解释下 为什么这里要平方根
减少运算量而已,
假设A=B*C(设B<C)
那么:
B<=Trunc(Sqrt(A)) 且 C>=Trunc(Sqrt(A))
------解决方案--------------------
减少运算量而已
但是最好用古老的筛素数法
比这个要快指数倍
------解决方案--------------------
------解决方案--------------------