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