用Delphi暴力破解数学攻克难题

技术与开发

读者 木宏:将1~9这9个数字填到下面公式的圆圈中,每个数字不能重复使用。这是一道小学的数学奥林匹克竞赛题,我小孩问我,可我也不会做。

○○○○×○=○○○○

小编:这道题的确有点难度,如果硬做太累了,不如用Delphi来进行暴力破解。

所谓暴力破解,就是把每个可能的数字都放进圆圈中试一遍,虽然工作量大,但都是电脑完成的。

在Delphi新建一个工程,然后在窗体中加入三个Edit框,用于显示三个数字,再加入一个Button按钮,双击按钮并写入如下代码:

procedure TForm1.Button1Click(Sender: TObject);

var

a,b,c:integer; // a、b、c分别为公式中的四位乘数、一位乘数和四位乘积。

a1,a2,a3,a4,c1,c2,c3,c4:integer; //这些是组成四位乘数a与四位乘积c的各个数字。

begin

for a:=1234 to 9876 do //由于数字不能重复使用,所以在可能四位乘数a中,最小的是1234,最大的是9876,虽然电脑也不在乎多算这一点,但笔者的脑也不是仅仅用来摆发型的^-^,况且笔者的机子还是赛扬的CPU,能省则省吧。

for b:=2 to 9 do //同样的道理,1也不能作为乘数b。

begin

c:=a*b;

a1:=a div 1000;

a2:=(a-a1*1000) div 100;

a3:=(a-a1*1000-a2*100) div 10;

a4:=a-a1*1000-a2*100-a3*10; //提取出乘数a中的千位、百位、十位和个位,此方法可以推而广之,用于提取数字中想要取的某位数字,或者用于秒进位成分和时等。

c1:=c div 1000;

c2:=(c-c1*1000) div 100;

c3:=(c-c1*1000-c2*100) div 10;

c4:=c-c1*1000-c2*100-c3*10; //提取出乘积c中的千位、百位、十位和个位。

if not ((a1=a2) or (a1=a3) or (a1=a4) or (a1=b) or(a1=c1) or (a1=c2) or (a1=c3) or (a1=c4)

or(a2=a3) or (a2=a4) or (a2=b) or(a2=c1) or (a2=c2) or (a2=c3) or (a2=c4)

or (a3=a4) or (a3=b) or(a3=c1) or (a3=c2) or (a3=c3) or (a3=c4)

or (a4=b) or(a4=c1) or (a4=c2) or (a4=c3) or (a4=c4)

or(b=c1) or (b=c2) or (b=c3) or (b=c4)

or (c1=c2) or (c1=c3) or (c1=c4)

or (c2=c3) or (c2=c4)

or (c3=c4) //各个数字不能相等,注意if后面的not。

or (c>9999) //乘积c不能是5位数字。由于单纯的判断并不会增加电脑的运算量,因此这里没有写成c>9876。

or (a1=0) or (a2=0) or (a3=0) or (a4=0)

or(b=0)

or(c1=0) or (c2=0) or (c3=0) or (c4=0)) then //数字在1~9之间,不能出现0。

begin

Edit1.Text:=Edit1.Text+' '+inttostr(a);

Edit2.Text:=Edit2.Text+' '+inttostr(b);

Edit3.Text:=Edit3.Text+' '+inttostr(c); //显示a、b、c的值,为了在结果有多个时能够全部显示出来,采用了这种显示方法。

end;

end;

end;

好了,运行一下,不用一秒钟,结果就出来了!答案有两组,分别是a=1738,b=4,c=6952和a=1963,b=4,c=7852。嘿嘿,看来还是电脑的“脑子”好使。