求一范围内的素数(质数)

有时去面试时会问到这样的问题,说难也不难,说不难也难,其实理清思路问题就不大了。

根据网上所谓的最佳方案,我们来理顺下它的思路;

素数也叫质数,即只能被1和自身整除的数就叫质数,能被其它的数整除的数叫合数,一个合数可以分解为二个或多个质数,即多个质数的乘积就为合数。

算法的思路:

      1.建立给定数据的布尔数组,把数组下标从2开始的全记为True;即每个数组对应一个值

           2.求最大数值的开平方,即此值最大的合数为开平方的值,

    3.数组对应的值能被开平方范围内的值所整除就说明此值不是质数,对应的数据设置为false;

以下代码为Delphi代码,用listbox来显示所有的质数:

procedure TForm1.DisplayAllValue(n: integer);
var
 i,j,k:Integer;
 bArr:TArray<Boolean>;
begin
  {下标从0开始,但0处值不计数值,数组多加一个,防止溢出}
  SetLength(bArr,n+1);
  for i := 1 to n+1 do
    bArr[i]:=True;
  k:=Floor(Sqrt(n));
  for i := 2 to k do
  begin
    j:=i;
    while j*i<=n do
    begin
      if bArr[i] then
        bArr[j*i]:=False; //是j的倍数就为非质数
      j:=j+1;
    end;
  end;

  {注意范围,最后一个数不要取,因为我们原来多加一个数}
  for i := 2 to n do
     if bArr[i] then
       ListBox1.Items.Add(IntToStr(i));
end;

  

原文地址:https://www.cnblogs.com/yagzh2000/p/4569195.html