有时去面试时会问到这样的问题,说难也不难,说不难也难,其实理清思路问题就不大了。
根据网上所谓的最佳方案,我们来理顺下它的思路;
素数也叫质数,即只能被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;