『今週の問題』第172回 解答


【コメント】

愛知県 迷子の雄猫 さんからのご指摘ですが、問題2と同じ条件で、となりあう3つの数の積が全て平方数になるようにすることはできるでしょうか。


◆愛知県 Y.M.Ojisan さんからの解答

【コメントの問題】

できない。

連続する4数をα,β,γ,δとするとき、
α*β*γ=P2、β*γ*δ=Q2(P,Qは自然数)です。

これより  α
δ
=(
2 であるので

α=XP2、δ=XQ2でなければなりません。

つまり3とびにXN2(X:非平方数)でなければなりません。

ところが2003は3と互いに素で輪になっているので、全部XN2でなければなりません。

この場合隣接3数の積はX32の形に限られ、Xは非平方数なので積を平方数にはできません。

なお、来年なら3の倍数なのでabN2、bcN2、caN2の繰り返しで可能です。

9個の場合を右に示します。
2、3、6、8、12、24、18、27、54


【問題1】

12+34*56+78+9=2003

【P.S.】

この問題、2004年も使えるようです。
さらに2007〜2029年も使え、これから100年のうちの80%程は解があります。
なお近いところで2014年は解が唯一であり、忘れたころに再利用するには最適でしょう。

【問題2】

可能 

平方数を異なる2数の積に分けるとき、
平方数がA2の場合は1とA2しかなく、たくさん作れない。

平方数がA22の場合はA2とB2しかなく共に平方数になり不可である。

従って、少なくとも平方数はA222の形であり、
隣接2数はA2BとBC2である。

この関係はBD2、BE2 。。。というように幾らでも付け足すことが可能である。
また隣接に限らず任意の組み合わせでもOKであり、輪になってもかまわない。
たとえば、2n2 など 異なる2003個の自然数の列の平方×非平方数で可能。


◆東京都の中学校3年生 紅孔雀 さんからの解答

【問題1】

 ア イ ウ エ オ カ キ ク
1_2_3_4_5_6_7_8_9

ア なし
イ +
ウ なし
エ ×
オ なし
カ +
キ なし
ク +

12+34×56+78+9=12+78+9+(34×56)
=99+1904
=2003となります。

【問題2】

答えは「できる」です。

【1つ目の考え方】

X+1個
目の数字
数字の式数字
2*41
2*4232
2*43128
2*44512
2*452048
2*468192
2*4732768
2*48131072
2*49524288
102*4102097152
・・・・・・
20002*420002.6364081868618862002077795884732e+1204
20012*420011.0545632747447544800831118353893e+1205
20022*420024.2182530989790179203324473415571e+1205

となり、数字は平方数でなく、隣り合う2つの数字の積は平方数となります。
1個目と2003個目の積も同じです。

【2つ目の考え方】

X+1個
目の数字
数字の式数字
2×101×2200
2×102×220000
2×103×22000000
2×104×2200000000
2×105×220000000000
2×106×22000000000000
2×107×2200000000000000
2×108×220000000000000000
2×109×22000000000000000000
102×1010×2200000000000000000000
・・・・・・
20002×102000×220000....(2の後に0が4000個)
20012×102001×220000....(2の後に0が4002個)
20022×102002×220000....(2の後に0が4004個)

となり、数字は平方数でなく、隣り合う2つの数字の積は平方数となります。
1個目と2003個目の積も同じです。

1個目を除いて、2個目以降の数字の式が、
(N+1)個目の場合…2×10N×2となり
2の後の0の個数が(Nは自然数、N×2は偶数となり)偶数になるので、

A【(2の後に0が偶数個ある値)】×B【(2の後に0が偶数個ある値)】
=C【2の後に(AとBにあった0の個数の合計)個の0がついた値】

となりCは、D【2の後に(Cにあった0の個数の合計の1/2)個の0がついた値】の平方となります。

よって、この場合は(1個目×2個目) (2個目×3個目)・・・(2002個目×2003個目)(2003個目×1個目)と計算し、その値の平方根の正数を求めると、整数となります。
(A×B=C SQR(C)=D A,B,C,Dは自然数)

なので、円周上に平方数でない2003個の異なる自然数を並べて、となりあう2つの数の積が全て平方数になるようにすることはできる。 ということになります。


◆長野県の高校生 SATOKI さんからの解答

【問題2】

n を2以上の自然数とし、X1 は素数とする。

n=X1・X22・X32・・・・Xn2 とする。

このとき、{An} の初項から第2003項までの数を円周上に任意の順に並べれば良い。

●証明

n=X1・(X2・X3・ ・・・・ ・Xn)2 より平方数ではない。

1≦m<n≦2003 とする。

n・Am
=(X1・X22・・・Xm2・Xm+12・・・Xn2)×(X1・X22・・・Xm2)
=(X1・X22・・・Xm2・Xm+1・Xm+2・・・Xn)2

∴成り立つ

実例 2,23,25,27,・・・,24005


◆広島県 清川 育男 さんからの解答

【問題1】

LET  S=0
 FOR N=0 TO 8
    LET  S=S+(4^N)*COMB(8,N)
 NEXT N
 PRINT "S=";S
 END

 S= 390625
12+3*456+7*89
12+34*56+78+9
1+2+34*56+7+89
1*2+345*6-78+9
1+23+45*6*7+89
12+345*6-7-8*9
1*2+3/4*5*67*8-9

390625通りの式から、上記の7通りが全てです。

●おまけ

逆小町算(987654321)
同じルールでは「解なし」でした。

【問題2】

出来る。

例えば、 2,23,25,.......,24001,24003 の2003個の平方数でない数を、時計回りに置けばよい。
隣同士を掛けると、指数は偶数になるから、 22n=(2n)の平方に出来る。


◆福島県の中学校3年生 おおさわ さんからの解答

【問題1】

チョット反則ですけど、自作プログラムを使って求めました。
解答は下が全てです。

1+2+34×56+7+89
1+23+45×6×7+89
12+3×456+7×89
12+34×56+78+9
1×2+345×6−78+9
1×2+3÷4×5×67×8−9
−1×2+345×6−7×8−9
−1×2+345×6+7−8×9
12+345×6−7−8×9

代数的解法は、恐らく存在しないと思われます。
解答検索プログラムはこちらです。

【青木コメント】

先頭の−を許容しているので、他の方より2つ多くなっています。
ぜひプログラムを実行してみてください。


◆東京都 明 さんからの解答

【問題1】

【問題1】 下記の7種類が解になります。

12+34*56+78+9
1*2+345*6-78+9
1*2+3/4*5*67*8-9
12+345*6-7-8*9
1+2+34*56+7+89
1+23+45*6*7+89
12+3*456+7*89

検出のためのプログラムを10進BASICで作りました。

---------------------------------
DECLARE EXTERNAL SUB KUMIAWASE
DIM X(9)    ! 数値配列
DIM Y(9)    ! 初期演算記号配列
DIM YY(9)   ! 演算記号バッファ
DATA 1,2,3,4,5,6,7,8,9   ! 数値の定義  
MAT Y=CON   ! 演算記号の設定
LET Y(9)=0
REM 1:+  2:-  3:*  4:/  5:桁結合  0:=
LET EFLG=0

DO
   RESTORE
   MAT READ X     ! 数値の設定
   MAT YY=Y
   CALL KEISAN    ! 計算の実行
   IF X(1)=2003 THEN      ! 正解出力
      LET P$=""  
      FOR I=1 TO 8 
         LET  P$=P$&STR$(I)        
         SELECT CASE Y(I)
         CASE 1
            LET P$=P$&"+"
         CASE 2
            LET P$=P$&"-"
         CASE 3
            LET P$=P$&"*"
         CASE 4
            LET P$=P$&"/"
         CASE 5
         END SELECT
      NEXT I
      LET  P$=P$&STR$(9) 
      PRINT P$
   END IF       
   CALL KUMIAWASE (Y,8,5,EFLG)   ! 次の演算記号配列の設定
LOOP UNTIL EFLG=1
 
SUB KEISAN    
   REM 桁結合の計算
   LET I=1
   LET J=1
   DO
      IF YY(J)=5 THEN
         LET I=I+1
         LET X(J)=10*X(J)+X(I)
         LET YY(J)=YY(I)
      ELSE
         LET I=I+1
         LET J=J+1
         LET X(J)=X(I)
         LET YY(J)=YY(I)
      END IF
   LOOP UNTIL YY(J)=0
   IF YY(1)=0 THEN EXIT SUB
    
   REM 乗除計算
   LET I=1
   LET J=1
   DO
      IF YY(J)=3 THEN 
         LET I=I+1
         LET X(J)=X(J)*X(I)
         LET YY(J)=YY(I)
      ELSEIF YY(J)=4 THEN
         LET I=I+1
         LET X(J)=X(J)/X(I)
         LET YY(J)=YY(I)
      ELSE
         LET I=I+1
         LET J=J+1
         LET X(J)=X(I)
         LET YY(J)=YY(I)
      END IF
   LOOP UNTIL YY(J)=0       
   IF YY(1)=0 THEN EXIT SUB
    
   REM 加減計算
   LET I=1
   LET J=1
   DO
      IF YY(J)=1 THEN 
         LET I=I+1
         LET X(J)=X(J)+X(I)
         LET YY(J)=YY(I)
      ELSEIF YY(J)=2 THEN
         LET I=I+1
         LET X(J)=X(J)-X(I)
         LET YY(J)=YY(I)
      END IF
   LOOP UNTIL YY(1)=0
END SUB

END       

EXTERNAL SUB KUMIAWASE(Y(),N,M,EFLG)
LET J=1
DO
   IF Y(J)<M THEN
      LET Y(J)=Y(J)+1
      EXIT DO
   ELSE
      LET Y(J)=1
      LET J=J+1
   END IF
   IF J=N+1 THEN
      LET EFLG=1
      EXIT DO
   END IF 
LOOP
END SUB
--------------------------------
【問題2】

円周上に配置された数は題意によりP*N2で表せる。
ここで、Pは平方数でない数、N2は平方数(1を含む)。

隣の数はP*N2との積が平方数となることからP*M2(M≠N)とならなくてはいけない。

したがってP*N2(N=任意の自然数)を円周上に配置すればよいことになります。

最小の数で配置されたものは2*N2(N=1,2,3・・・,2003)となります。


◆埼玉県 白石 和夫 さんからの解答

【問題1】

1234+56-7+8*90 12+345*6-7-8*9+0 12+34*56+78+9+0 12+3+45*6*7+8+90 12+3*456+7*89+0 1+23+45*6*7+89+0 1+2+34*56+7+89+0 1*2+345*6-78+9+0 1*2+3/4*5*67*8-9+0

(仮称)十進BASICの有理数モードで計算しました。
*は×,/は÷と読んでください。

【青木コメント】

最後に0が入っているので、他の方より2つ多くなっています。
プログラムの比較が面白いので、そのまま掲載します。

DECLARE EXTERNAL FUNCTION interpreter.eval
 
CALL gen("1",2)

SUB gen(t$,n)
   IF n=10 THEN 
      IF eval(t$) = 2003 THEN PRINT t$ 
   ELSE
      CALL gen(t$ & STR$(n), n+1)
      CALL gen(t$ & "+" & STR$(n), n+1)
      CALL gen(t$ & "-" & STR$(n), n+1)
      CALL gen(t$ & "*" & STR$(n), n+1)
      CALL gen(t$ & "/" & STR$(n), n+1)
   END IF
END SUB

END

MODULE interpreter 
PUBLIC FUNCTION eval
SHARE STRING s$
SHARE NUMERIC i
SHARE FUNCTION expression,term,factor,primary,NUMERIC
SHARE SUB SKIP

EXTERNAL FUNCTION eval(t$)
   LET s$=t$
   LET i=1
   CALL SKIP
   LET eval=expression
END FUNCTION
 
EXTERNAL SUB skip
   DO WHILE s$(i:i)=" "
      LET i=i+1
   LOOP
END SUB

EXTERNAL FUNCTION expression 
   DECLARE NUMERIC n
   DECLARE STRING op$
   SELECT CASE s$(i:i)
   CASE "-"
      LET i=i+1
      CALL skip
      LET n=term
   CASE "+"
      LET i=i+1
      CALL skip
      LET n=term
   CASE ELSE 
      LET n=term
   END SELECT
   DO WHILE s$(i:i)="+" OR s$(i:i)="-"
      LET op$=s$(i:i)
      LET i=i+1
      CALL skip
      IF op$="+" THEN LET n=n+term ELSE LET n=n-term
   LOOP
   LET expression =n
   CALL skip
END FUNCTION

EXTERNAL FUNCTION term
   DECLARE NUMERIC n
   DECLARE STRING op$
   LET n=factor
   DO WHILE s$(i:i)="*" OR s$(i:i)="/"
      LET op$=s$(i:i)
      LET i=i+1
      CALL skip
      IF op$="*" THEN LET n=n*factor ELSE LET n=n/factor
   LOOP
   LET term=n
END FUNCTION

EXTERNAL FUNCTION factor
   DECLARE NUMERIC n
   LET n=primary
   DO WHILE s$(i:i)="^" 
      LET i=i+1
      CALL skip
      LET n=n^primary 
   LOOP
   LET factor=n
END FUNCTION

EXTERNAL FUNCTION primary
   IF s$(i:i)="(" THEN
      LET i=i+1
      CALL skip
      LET  primary=expression
      IF s$(i:i)=")" THEN
         LET i=i+1
         CALL skip
      ELSE
         PRINT "Syntax error"
         STOP
      END IF
   ELSE
      LET  primary=numeric
   END IF
END FUNCTION
 
EXTERNAL FUNCTION numeric
   DECLARE NUMERIC i0
    
   CALL skip
   LET i0=i
   DO WHILE s$(i:i)>="0" AND s$(i:i)<="9" 
      LET i=i+1
   LOOP
   LET numeric=VAL(s$(i0:i-1))
   CALL skip
END FUNCTION

END MODULE

 ◆ 問題へもどる

 ◆ 今週の問題

数学の部屋へもどる