求"哥德巴赫猜想"更快的算法(50分)

  • 主题发起人 主题发起人 jy02113184
  • 开始时间 开始时间
J

jy02113184

Unregistered / Unconfirmed
GUEST, unregistred user!
以下是我的算法,不过速度还不是很理想

function IsPrime(n:integer):boolean
//返回n是否素数,n>=2
var i:integer;
begin
i:=2;
while i<=sqrt(n+2) do
if ( n mod i = 0 ) then //i能整除n吗?
begin
IsPrime:=false
//n不是素数
exit;
end
else
i:=i+1;
IsPrime:=true; //n是素数
end;
{$R *.dfm}

procedure TForm1.btnsumClick(Sender: TObject);
var
flag,FstNum,SndNum,total:integer;
begin
lxbtotal.Clear;
FstNum:=1;
SndNum:=1;
total:=strtoint(Edtname.text);
if (total>99999) and (total mod 2=0) then //判断输入的数是否是大于6位数的偶数
begin
Form1.Caption:='计算中。。。。。。';
while SndNum>=FstNum do//当第一个数比第二个数大时跳出循环
begin
FstNum:=FstNum+2;
SndNum:=total-FstNum;//两个数分别累加与累减,且两数的值和为输入的数
if (IsPrime(FstNum)) and (IsPrime(SndNum)) then//判断两数是否为素数
begin
lxbtotal.Items.Strings[flag]:=(inttostr(total)+'='+inttostr(FstNum)+'+'+inttostr(SndNum));//输出判断后的值
Edtname.SetFocus;
flag:=flag+1;
end;
end;
Form1.Caption:='计算完毕';
end
else
begin
lxbtotal.Items.Add(inttostr(total)+'小于6位数或为奇数');//超出范围的提示
Edtname.SetFocus;
end
end;
 
lxbtotal.Items.Strings[flag]:=(inttostr(total)+'='+inttostr(FstNum)+'+'+inttostr

这些东西全部去掉地说。。速度高一倍。。你试一下。。。

最后才显示出来就好了
 
我要的是把全部合要求的答案都列出来,所以去掉后不合要求
 
仅仅只考虑改进算法的情况下,改进了判断素数的算法;猜想的算法加了个重要的判断。自己看不明白的你就提出来。(减少了20%的素数的计算,素数的判断也加快)

function IsPrime(n:integer):boolean
//返回n是否素数,n>=2
var i,t:integer;
begin
i:=3;
t:=trunc(sqrt(n))
//只计算一次开方
while i<=t do
if ( n mod i = 0 ) then //i能整除n吗?
begin
result:=false
//n不是素数,提前退出
exit;
end
else
if (i=3) then i:=i+4 else i:=i+2
//只计算奇数,跳过尾数5的判断
result:=true;
end;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
flag,FstNum,SndNum,total,EndNum,Tmp,TmpTime:integer;
begin
lxbtotal.Clear;
FstNum:=1;
SndNum:=1;
flag:=0;
total:=0;
total:=strtoint(Edtname.text);
EndNum:=total mod 10
//计算原数的尾数
if (total>99999) and (total mod 2=0) then //判断输入的数是否是大于6位数的偶数
begin
Form1.Caption:='计算中。。。。。。';
TmpTime:=GetTickCount;
while SndNum>=FstNum do //当第一个数比第二个数大时跳出循环
begin
FstNum:=FstNum+2;
Tmp:=(FstNum+5) mod 10
//计算尾数
if ((Tmp=EndNum) or (Tmp=0)) then Continue
//尾数为5或加5后尾数相同就不会有解
SndNum:=total-FstNum
//计算第二个数
if (IsPrime(FstNum)) and (IsPrime(SndNum)) then //判断两数是否为素数
begin
lxbtotal.Items.Strings[flag]:=(inttostr(total)+'='+inttostr(FstNum)+'+'+inttostr(SndNum));//输出判断后的值
flag:=flag+1;
end;
end;
Label1.Caption:=format('总耗时为 %D 毫秒', [GetTickCount - TmpTime]);
Form1.Caption:='计算完毕';
end
else
begin
lxbtotal.Items.Add(inttostr(total)+'小于6位数或为奇数');//超出范围的提示
Edtname.SetFocus;
end;
lxbtotal.items.add(inttostr(flag))
//输出解的总数
end;
 
上面的判断素数时在我提问后也优化了
而后面的,如果按你的意思应该是当尾数为5的时候就不用判断是否为偶数~~如果我的意思理解有误的话,请指出
你的程序有问题,我按你的提示已经优化了整个程序,速度还是才不了多少~~~
Thank you`~~~
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
915
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部