はいどーもー
乙pyです。

暇なので受験シーズンだし
有名中学の算数の問題をプログラムで解けないかと
思ったりしたわけですね。

インターネットの
Googleで調べたんですが
そこで問題が難しそうな学校を見つけてしまったんですね。

皆さん

難しい中学校って知ってます?

自分は近所の中学校に行ったので
知らないんですけど
問題を解いてみたんですねー

というものの第三弾です。


動画解説はこちら



さて最初の問題は
有名中学の入試問題.024

2桁と4桁の整数同士の結果を問う問題なので
試行回数が増えますね。

変数a と x の2重ループになるという考えで進みました。

整数aとxをかけると119868
整数aの10と1の位を0に置き換えたものを
変数bすると

求める数の条件は
a * x == 119868
かつ
b * x == 117600
になりますね。

あとは複数出たaの中から
最大の整数を求めれば終了です。


答えは次のようなプログラムになりました。
r = []
for a in range(1000,10000):
    for x in range(10,100):
        b = int(str(a)[0:2] +'00')
        if a * x == 119868 and b * x == 117600:
                r.append(a)
                print(a,x)
print(max(r))



お次の問題は
有名中学の入試問題.023


数字の穴埋め問題ですね

さて
整数ABCDEF に6をかけると
整数DEFABC になるという問題

普通に解くなら少しづつ試す感じになりますが
プログラムは力技で解いていきます。

6桁分の整数を全部条件に当てはめて解いてみます。

for i in range(100000,1000000):

そして
その変数 i を6桁のABCDEFと仮定して
それに6をかけてDEFABCになれば
正解が導き出せるわけです。

数値文字列にして、インデックスで各桁の数値を
変数a,b,c,d,e,fに置き換えます。

あとは条件に当てはまるかを
if文で書くだけです。

ABCDEFを求めるプログラムはこうなりました。

for i in range(100000,1000000):
    x =str(i)
    a,b,c,d,e,f = x[0],x[1],x[2],x[3],x[4],x[5]
    if i*6==int(d+e+f+a+b+c):
        print(x)
        break

DEFは末尾3桁をとれば良いですね。

プログラムで解く際には
試行回数が少ない方が効率が良いので
いかに試行回数を減らすことができるかも
ポイントになりますが

今回は力技でした。