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


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

●アルゴリズムの確認用のプログラム

LET N=4  !有効な数値
LET MX=500
LET DM=INT(LOG(MX)/LOG(N))+1
DIM X(0 TO DM)
LET NG=0
FOR J=N^2+1 TO MX
   LET D=J
   LET M=1
   CALL main
NEXT J
IF NG=0 THEN
   PRINT "すべてOK"
ELSE
   PRINT "NGあり"
END IF
STOP

SUB main
   IF MOD(D,N)=0 THEN EXIT SUB
   PRINT D;
   LET P=0
   DO
      LET P=P+1
      LET NO=4^P
      LET CT=0
      DO
         CALL calc
         CALL check
         LET CT=CT+1
         IF M=0 THEN EXIT DO
         IF CT=NO THEN EXIT DO
      LOOP
   LOOP UNTIL M=0
   CALL makear
   CALL operat
   CALL count
   IF S<>P+1 THEN
      PRINT "NG"
      PRINT "NUMBER =";D
      CALL print
      PRINT "たたいた回数:";P+1
      CALL makear
      PRINT "BASE: ";
      FOR L=0 TO K
         PRINT X(K-L);
      NEXT L
      PRINT
      CALL operat
      PRINT "CONV: ";
      FOR L=0 TO K
         PRINT X(K-L);
      NEXT L
      PRINT
      LET NG=1
   ELSE
      PRINT "OK"
   END IF
END SUB

SUB calc
   LET OPN=CT
   LET OC=P
   LET S=N
   DO
      LET OP=MOD(OPN,4)
      LET OPN=INT(OPN/4)
      SELECT CASE OP
      CASE 0
         LET S=S-N
      CASE 1
         LET S=S/N
      CASE 2
         LET S=S+N
      CASE 3
         LET S=S*N
      END SELECT
      LET OC=OC-1
   LOOP UNTIL OC=0
END SUB

SUB check
   IF S<=0 THEN EXIT SUB
   IF D=S THEN
      LET M=0
   END IF
END SUB


SUB print
   LET OPN=CT
   LET OC=P
   LET NB$=STR$(N)
   LET CH$="C" & NB$
   DO
      LET OP=MOD(OPN,4)
      LET OPN=INT(OPN/4)
      SELECT CASE OP
      CASE 0
         LET CH$=CH$ & "-" & NB$
      CASE 1
         LET CH$=CH$ & "/" & NB$
      CASE 2
         LET CH$=CH$ & "+" & NB$
      CASE 3
         LET CH$=CH$ & "*" & NB$
      END SELECT
      LET OC=OC-1
   LOOP UNTIL OC=0
   LET CH$=CH$ & "=" & STR$(S)
   PRINT CH$
END SUB

SUB makear
   LET DX=D
   LET K=0
   MAT X=ZER
   DO
      IF DX=0 THEN EXIT DO
      LET X(K)=MOD (DX,N)
      LET DX=INT(DX/N)
      LET K=K+1
   LOOP
END SUB

SUB operat
   IF MOD (N,2)=0 THEN
      FOR L=0 TO K
         IF X(L)>=N/2+1 THEN
            LET X(L)=X(L)-N
            LET X(L+1)=X(L+1)+1
         END IF
      NEXT L
      FOR L=0 TO K-3
         IF X(L)>=N/2+1 THEN
            LET X(L)=X(L)-N
            LET X(L+1)=X(L+1)+1
         END IF
         IF X(L)=N/2 AND X(L+1)<0 THEN
            LET X(L)=X(L)-N
            LET X(L+1)=X(L+1)+1
         END IF
         IF X(L)=N/2 AND X(L+1)=N/2 THEN
            LET X(L)=X(L)-N
            LET X(L+1)=X(L+1)+1-N
            LET X(L+2)=X(L+2)+1
         END IF
      NEXT L
      FOR L=K-2 TO K
         IF X(L)>=N/2+1 THEN
            LET X(L)=X(L)-N
            LET X(L+1)=X(L+1)+1
         END IF
         IF X(L)=N/2 AND X(L+1)<0 THEN
            LET X(L)=X(L)-N
            LET X(L+1)=X(L+1)+1
         END IF
      NEXT L
   ELSE
      FOR L=0 TO K-2
         IF X(L)>=(N+1)/2 THEN
            LET X(L)=X(L)-N
            LET X(L+1)=X(L+1)+1
         END IF
      NEXT L
      IF X(K-1)>=(N+1)/2+1 THEN
         LET X(L)=X(L)-N
         LET X(L+1)=X(L+1)+1
      END IF
   END IF
END SUB

SUB count
   LET S=0
   FOR L=0 TO K
      LET S=S+ABS(X(L))
   NEXT L
   IF X(K)=0 THEN
      LET S=S+K
   ELSE
      LET S=S+K+1
   END IF
END SUB

END


 ◆ 問題へもどる

 ◆ 今週の問題

数学の部屋へもどる