第20回日本数学オリンピック予選(2010)問題解法プログラム
サレジオ学院高等学校
数学科教諭 浜田 明巳
パソコン部2年 小西 正人

 現在入試問題でプログラムを出題しているのは,私の知っている限りセンター試験と慶應義塾大学の総合政策,環境情報の両学部だけである.しかし新学習指導要領で数学からプログラムがなくなり,入学試験にも出題されなくなる.過年度生用に選択問題として残るから,当面は出題が続くだろうが,すぐなくなる運命だろう.
 実際数学Bの教科書に載っているプログラムを動かすソフトは,ほとんど出回っていない.それを学習せよと言っても無理な話である.私の知っている限りでは,インターネット上にフリーソフトのWINBASICや99BASICが載っており,この2つがそのままで教科書のプログラムを動かすことの出来るものである.昔のN88BASICやFBASICが動けば,当然それで良い.しかし最近のOSのバージョンアップに伴い,パソコンを買い換える際に,BASICを再インストールした人は大変少ないのではないか.そもそもN88BASICはWINDOWS上では動かない.多少プログラムを手直しすれば,十進BASICやUBASICでも動くが,まったく同じものではない.
 プログラムに関しては,既に情報の授業で習うものとなっているので,今後はそちらの方で頑張るしかないのだろう.私の学校でも,EXCELのマクロやVBSCRIPTを情報で学習している.大学の理系の授業では,情報でC言語や,FORTRANなどを学ぶと聞く.1つのプログラム言語を知っていれば,他の言語の習得も容易くなるはずだ.
 予備校のセンター試験解説を聞くと,プログラムを選択した者の得点は,出来る,出来ないの差がはっきり表れているという.約数,倍数の問題など,決まり切っているものが多いので,あらかじめ学習しておけば,高得点は十分期待出来る.パソコン好きの生徒にとっては,ベクトルや数列よりも点は取りやすい.少なくとも選択の幅が広くなり,有利となるのは間違いない.
 最後のあがきとして,プログラムを投稿したい.
 12題の中で,1,2,3,4が初歩的なプログラム(For Next)で解ける問題,5,7,10がプログラム自体は簡単だが(For Next,再帰),解くのに大変な時間がかかってしまう問題,8,11が図形問題で特殊な方法で解くもの.そして問題6,9,12は解けなかった.桁数が多くなったり,次数が高すぎたりして,コンピュータ向きではないからだ.
 EXCELのマクロの作成方法は次の通り.メニューバーにおいて,
  ツール
  マクロ
  マクロ
  マクロ名記入 または 作成 または 編集
で,マクロを記入開始.バージョンによって多少の違いがある.マクロのセキュリティレベルを最低にしておく事も必要である.
 グラフ表示ソフトのGRAPESは,
  http://www.osaka-kyoiku.ac.jp/~tomodak/grapes/index.html
からダウンロード出来るフリーソフトである.スクリプト(プログラム)も組む事が出来るので,図形問題だけでなく,計算問題も解く事が出来る.講談社ブルーバックス等で詳しい解説書が出ている.2,3ヶ月に1回はバージョンアップしているので,時々チェックしておくべきだ.
 十進BASICは,
  http://www.vector.co.jp/authors/VA008683/
からダウンロード出来るフリーソフトである.扱う数学関数も豊富であり,数学の先生向きのソフトである.有理数計算,多桁計算も出来る.図形表示も簡単である.
 UBASICは,
  http://www.rkmath.rikkyo.ac.jp/%7Ekida/ubasic.htm
からダウンロード出来るフリーソフトである.計算能力にかけては,これに勝るソフトはない.1000の階乗もあっという間に計算出来る.扱う数学関数も豊富であり,有理数計算,多項式計算も出来る.
 上記以外のソフト(一太郎,CABRI,VISUAL BASIC等)でも解法プログラムを作ったので,もし興味があるのなら,サレジオ学院高等学校浜田宛で,その旨連絡して下さい.メールでプログラムを配布したいと思っています(※).

(※)〒224−0029 神奈川県横浜市都筑区南山田3−43−1
              サレジオ学院高等学校 浜田 明巳
    メールアドレス:akemi_hamada0213@yahoo.co.jp

                参考文献:数学オリンピック財団Web Site
                    大学への数学 2010年3月号 東京出版
                     神奈川数学部会通信 2010年


第20回日本数学オリンピック予選(2010)問題1
 a>b>c>d>e>fをみたし,a+f=b+e=c+d=22となるような正の整数の組(a,b,c,d,e,f)はいくつあるか.

作成者:パソコン部2年 小西 正人
(C++編)
#include<iostream.h>
void main(){
 int kotae;
 int j;
 int i;
 int k;
 kotae=0;
 for(j=1; j<=10; j++){
  for(i=j+1; i<=10; i++){
   for(k=i+1; k<=10; k++){
    kotae++;
   }
  }
 }
 cout << kotae << endl;

}

 


作成者:数学科教諭 浜田 明巳
 典型的なFor Nextプログラムである.一番数が小さいfをFor Nextで回す
(1≦f≦22−5).その都度a=22−fでaを求め,a>fの時,次に小さいeをFor Nextで回す(f+1≦e≦a−4).b=22−eでbを求め,a>b>eの時,dをFor Nextで回す(e+1≦d≦b−2).b>c>dの時カウントし,最終的に答を表示する.EXCELでは,すべてのa,b,c,d,e,fの組も表示するようにしてある.このようにEXCELはすべての解を表示するのに最適なソフトである.
 このプログラムにより,答は120組である事が分かる.

(BASIC編,センター試験仕様)
100 LET K=0
110 FOR F=1 TO 22-5
120    LET A=22-F
130    IF A<=F THEN GOTO 240
140    FOR E=F+1 TO A-4
150       LET B=22-E
160       IF A<=B OR B<=E THEN GOTO 230
170       FOR D=E+1 TO B-2
180          LET C=22-D
190          IF B<=C OR C<=D THEN GOTO 220
200          LET K=K+1
210          PRINT K;A;B;C;D;E;F
220       NEXT D
230    NEXT E
240 NEXT F
250 END


第20回日本数学オリンピック予選(2010)問題2
 0以上10000以下の整数の中で,10進法で表記したときに1が現れないようなものすべての平均を求めよ.

作成者:数学科教諭 浜田 明巳
 典型的なFor Nextプログラムである.この整数をnとすると,0≦n≦9999となり高々4桁である.一の位をn1,十の位をn2,百の位をn3,千の位をn4と
し,それぞれをFor Nextで回す(0≦n1,n2,n3,n4≦9).ただしn1,
n2,n3,n4≠1(If文使用).nの個数を分母に,nの和を分子にして,最後に分母,分子の最大公約数を計算して,割り算をして,答の分数を求める.最大公約数を計算する際に再帰を使っている.
 このプログラムにより,答は48884/9である事が分かる.

(EXCELマクロ)
Option Explicit
Sub jmo1002()
    Dim n1 As Integer '一の位
    Dim n2 As Integer '十の位
    Dim n3 As Integer '百の位
    Dim n4 As Integer '千の位
    Dim g As Long '分母,分子の最大公約数
    Cells(1, 1).Value = 0 '答の分子
    Cells(1, 2).Value = 0 '答の分母
    Range("A1").Select
    For n1 = 0 To 9
      If n1 <> 1 Then
        For n2 = 0 To 9
          If n2 <> 1 Then
            For n3 = 0 To 9
              If n3 <> 1 Then
                For n4 = 0 To 9
                  If n4 <> 1 Then
                    Cells(1, 2).Value = Cells(1, 2).Value + 1
                    Cells(1, 1).Value = Cells(1, 1).Value + (n1 + n2 * 10 + n3 * 100 + n4 * 1000)
                  End If
                Next n4
              End If
            Next n3
          End If
        Next n2
      End If
    Next n1
    g = GCM(Cells(1, 1).Value, Cells(1, 2).Value)
    Cells(1, 1).Value = Cells(1, 1).Value / g
    Cells(1, 2).Value = Cells(1, 2).Value / g
End Sub
Private Function GCM(ByVal a As Long, ByVal b As Long) As Long
    If b = 0 Then
      GCM = a
    Else
      GCM = GCM(b, a Mod b)
    End If
End Function


第20回日本数学オリンピック予選(2010)問題3
 各桁の数字が相異なり,どれも0でないような3桁の正の整数nがある.nの各桁の数字を並べ替えてできる6つの数の最大公約数をgとする.gとして考えられる最大の値を求めよ.

作成者:数学科教諭 浜田 明巳
 典型的なFor Nextプログラムである.nの各桁の数をn1,n2,n3とする.対称性を考えて,n1<n2<n3としてよい.For Nextでn1,n2,n3を回し
(1≦n1≦9−2,n1+1≦n2≦9−1,n2+1≦n3≦9),それぞれの場合の位を代えた6個の整数の最大公約数を求め,その中で最大のものを求める.
 このプログラムにより,答は18で,n=468の時である事が分かる.

(EXCELマクロ)
Option Explicit
Sub jmo1003()
    Dim n1 As Integer 'nの各桁,n1<n2<n3
    Dim n2 As Integer
    Dim n3 As Integer
    Dim g As Integer '最大公約数
    Cells(1, 1).Value = 0 '答
    Cells(2, 1).Value = 0 '答の個数
    For n1 = 1 To 9 - 2
      For n2 = n1 + 1 To 9 - 1
        For n3 = n2 + 1 To 9
          g = GCM(n1 * 100 + n2 * 10 + n3, n1 * 100 + n3 * 10 + n2)
          g = GCM(g, n2 * 100 + n1 * 10 + n3)
          g = GCM(g, n2 * 100 + n3 * 10 + n1)
          g = GCM(g, n3 * 100 + n1 * 10 + n2)
          g = GCM(g, n3 * 100 + n2 * 10 + n1)
          If Cells(1, 1).Value < g Then
            Cells(1, 1).Value = g
            Cells(2, 1).Value = 1
            Columns("B:B").Select
            Selection.ClearContents
            Range("A1").Select
            Cells(1, 2).Value = n1 * 100 + n2 * 10 + n3
          ElseIf Cells(1, 1).Value = g Then
            Cells(2, 1).Value = Cells(2, 1).Value + 1
            Cells(Cells(2, 1).Value, 2).Value = n1 * 100 + n2 * 10 + n3
          End If
        Next n3
      Next n2
    Next n1
End Sub
Private Function GCM(ByVal a As Integer, ByVal b As Integer) As Integer
    If b = 0 Then
      GCM = a
    Else
      GCM = GCM(b, a Mod b)
    End If
End Function