用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。嘿嘿,看来还是电脑的“脑子”好使。