也不清楚程序有没编写错误,第2个28点的情况明天用纸笔验证下,今天有些晚了
在圆周上选取正10000边形(第2次28个)的顶点
依次编号0,1,2,3,...,9999
模仿“找素数的筛子”,0,1作为保留的“种子”,开始,顺逆时针方向,划掉成等差数列的数,接下来划掉2,与999,因为0,1,2;999,0,1(mod10000)成等差,3,4保留,接下来依次划掉5,6,7,8,997,(997,0,3mod10000成等差),...,这样10000个数字要划掉9586个;第2个例子28点要划掉20点,也就是说1/3的点都没有了,由抽屉原理说明1楼一定存在等腰三角形。
逻辑上还是有些不严密(为什么这样做,保留下的点与最多情景差不多,我也不能肯定),但第一个保留下的点远小于1/3了。
0Running "d:\fpc\2.4.0\bin\i386-win32\shuzu.exe "
0
9586
║var
║a:array[0..9999] of integer;
║m,i,j:integer;
║begin
║for i:=0 to 9999 do a[i]:=i;
║a[2]:=0;
║a[9999]:=0;
║for i:=3 to 4999 do
║ if a[i]<>0 then
║ for j:=0 to i-1 do
║ if a[j]<>0 then
║ begin
║ m:=2*i-j;
║ a[m]:=0;
║ m:=2*j-i;
║ if m<0 then a[m+9999+1]:=0;
║ end;
║ writeln(a[5000]);
║m:=0;
║for i:=0 to 9999 do
║ if a[i]=0 then m:=m+1;
║writeln(m);
║
║end.
║
║
0
20
var
a:array[0..27] of integer;
m,i,j:integer;
begin
for i:=0 to 27 do a[i]:=i;
a[2]:=0;
a[27]:=0;
for i:=3 to 13 do
if a[i]<>0 then
for j:=0 to i-1 do
if a[j]<>0 then
begin
m:=2*i-j;
a[m]:=0;
m:=2*j-i;
if m<0 then a[m+27+1]:=0;
end;
writeln(a[14]);
m:=0;
for i:=0 to 27 do
if a[i]=0 then m:=m+1;
writeln(m);
end. |