紧急问题!!100分请教一个求质数的问题,已经有一种算法(100分)

  • 主题发起人 主题发起人 beyondbit
  • 开始时间 开始时间
B

beyondbit

Unregistered / Unconfirmed
GUEST, unregistred user!
100分请教一个求质数的问题,已经有一种算法,但是这个不完善,不能准确求出质数,比如15这个数字它就判断不出来
要求:
能够显示出计算结果内最大的质数。 如11,最大的质数是11。
能够显示出所有算出来的质数(做为一个選項,不需要一边计算一边显示,即,如果选
择“显示”质数選項的话,那么就必须将所计算出来的所有质数列举出来)。
能够显示出最短所需要的计算时间(在没有一边显示计算结果的情况之下,即,不选
择“显示”质数選項的情形)。
var
a:array of integer;
i,n,p,t,s,count:integer;
begin
n:=strtoint(edit1.Text);
setlength(a,n+1);
//开始筛选 0表示不是质数 ,1表示质数在其中
for i:=n downto 2 do //质数是从2开始的数字
begin
a:=1;
end;
for i:=(n div 2) downto 2 do //2的1倍以上的倍数也不为质数
begin
a[i*2]:=0;
end;
p:=2;
while (p*p<n) do
begin
a[p*p]:=0;
p:=p+1;
while(a[p]=0)do
begin
p:=p+1;
t:= p * p;
s:= 2 * p;
end;
while(t <= n) do
begin
a[t]:= 0;
t:= t + s;
end;
end;
count:=0;
for i:=n downto 2 do
begin
if a=1 then
begin
//edit3.Text:=inttostr(a);
count:=count+1;
end;
edit2.Text:=inttostr(count);
end;
 
你这个 for i := (n div 2) downto 2 do 就不对呀
在n downto n div 2 这段可能有质数
 
unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Spin, Grids;

type
TForm1 = class(TForm)
SpinEdit1: TSpinEdit;
SpinEdit2: TSpinEdit;
SpinEdit3: TSpinEdit;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Memo1: TMemo;
procedure Button2Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FFa:array of Byte;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
var
I:Integer;
K:Integer;
x:Int64;
S:TStringList;
begin
x:=GetTickCount;
for I:=2 to High(FFa) do
begin
if FFa=0 then
begin
for K:=2 to (High(FFa)+1) div I+1 do
if I*K<=High(FFa) then
FFa[I*K]:=1;
end;
end;
S:=TStringList.Create;
try
for I:=2 to High(FFa) do
begin
if FFa=0 then
S.Add(IntToStr(I));
end;
Memo1.Text:=S.Text;
SpinEdit2.Value:=S.Count;
finally
S.Free;
end;
SpinEdit3.Value:=GetTickCount-x;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
SetLength(FFa,SpinEdit1.Value+1);
end;

end.
 
object Form1: TForm1
Left = 192
Top = 107
ActiveControl = Button2
BorderStyle = bsDialog
Caption = 'Form1'
ClientHeight = 453
ClientWidth = 328
Color = clBtnFace
Font.Charset = ANSI_CHARSET
Font.Color = clWindowText
Font.Height = -13
Font.Name = #23435#20307
Font.Style = []
OldCreateOrder = False
Position = poScreenCenter
OnCreate = FormCreate
PixelsPerInch = 96
TextHeight = 13
object Label1: TLabel
Left = 80
Top = 10
Width = 26
Height = 13
Caption = #33539#22260
end
object Label2: TLabel
Left = 54
Top = 34
Width = 52
Height = 13
Caption = #32032#25968#20010#25968
end
object Label3: TLabel
Left = 2
Top = 58
Width = 104
Height = 13
Caption = #25152#29992#26102#38388#65288#27627#31186#65289
end
object SpinEdit1: TSpinEdit
Left = 111
Top = 7
Width = 121
Height = 22
MaxValue = 10000000
MinValue = 1
TabOrder = 1
Value = 100000
end
object SpinEdit2: TSpinEdit
Left = 111
Top = 31
Width = 121
Height = 22
MaxValue = 10000000
MinValue = 0
ReadOnly = True
TabOrder = 2
Value = 1
end
object SpinEdit3: TSpinEdit
Left = 111
Top = 55
Width = 121
Height = 22
MaxValue = 10000000
MinValue = 0
ReadOnly = True
TabOrder = 3
Value = 1
end
object Button2: TButton
Left = 238
Top = 6
Width = 75
Height = 25
Caption = #35745#31639#32032#25968
TabOrder = 0
OnClick = Button2Click
end
object Memo1: TMemo
Left = 8
Top = 80
Width = 313
Height = 361
Lines.Strings = (
'Memo1')
ScrollBars = ssVertical
TabOrder = 4
end
end
 
把上面那一段保存为Unit2.dfm,和unit2.pas放一起建个工程一加,就搞定了
 
这个也是筛选法求质数个数,但最大质数要怎么求? 而且要尽量避免用更多的时间来完成求最大的质数
 
问题已经自己解决,谢谢
 
做人要厚道,怎么解决的都没说!
 
这个好找,用要求的数字去mod比2大,比DIV值小范围内的所有数字结果为0,如果COUNT的个数=0就不是质数,乘等操作都太慢
 
因为存储在stringlist里的字符串列表也是数组类型,所以使用数组[length-1]就可以了
 
好久没上了忘记结帖子了 ,顺便在问一个问题就结

我以前用intraweb做了一个网站 是7.0.11评估版本做的,现在不能运行了 想在intraweb7.2破解版里打开调试,可是出现打不开 我要怎么样把以前的版本做的 升级到我现在这个版本能打开来呀 ??
 
后退
顶部