◆東京都 明 さんからの解答
●アルゴリズムの確認用のプログラム
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
◆ 問題へもどる
◆ 今週の問題へ