没错,前面是我想的不周到。
甲说:“我不知道X和Y是多少,但你也不知道”
这句话表示,不是两个质数,因为如果是2个质数,那么乙肯定知道。
但甲只知道两数的和,怎么知道不是两个质数呢?肯定是和的所有分解都不会是两个质数相加。
由此可得到和的集合。
乙说:“我知道X和Y分别是多少了!”
甲说:“我也知道了”
表示所有相加组合中,两数的积的所有分解,的和,只有1个是在和的集合中。
下面是算法:(一个上午啊…………)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Memo1: TMemo;
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
function IsZhi(a: integer): BOOLEAN;
function Check2(a: integer): BOOLEAN;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
i, j: integer;
k:boolean;
begin
memo1.Lines.Clear;
for i := 6 to 60do
begin
for j := 2 to i div 2do
begin
if not IsZhi(j) then
begin
k := true;
continue;
end
else
if IsZhi(i - j) then
begin
k := false;
break;
end;
end;
if k then
memo1.Lines.Add(inttostr(i));
end;
Button2Click(nil);
end;
function TForm1.IsZhi(a: integer): BOOLEAN;
var
i: integer;
begin
result := true;
for i := 2 to a - 1do
if (a mod i) = 0 then
begin
result := false;
Exit;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
i, j, n, m, x, y: Integer;
begin
for i := 0 to memo1.Lines.Count - 1do
begin
n := StrToInt(memo1.Lines.Strings
);
m := 0;
for j := 2 to n div 2do
begin
if Check2(j * (n - j)) then
begin
m := m + 1;
x := j;
y := n - j;
end;
end;
if m = 1 then
begin
showmessage(inttostr(x)+' -- '+inttostr);
Exit;
end;
end;
end;
function TForm1.Check2(a: integer): BOOLEAN;
var
i, n, m: Integer;
begin
result := false;
n := 0;
m := 0;
for i := 2 to a div 2 - 1do
begin
if a mod i <> 0 then
Continue
else
if (memo1.Lines.IndexOf(IntToStr(i + (a div i))) <> -1) and (i <> m) then
begin
m := a div i;
n := n + 1;
end;
end;
if n = 1 then
result := true;
end;
end.