|
> No.3842[元記事へ]
> 問題
> 1=1/a+1/b+1/cを満たす自然数a,b,cを求めよ。
OPTION ARITHMETIC RATIONAL !有理数モード
LET K=3 !項数
DIM B(K)
PUBLIC NUMERIC C !場合の数
LET C=0
CALL try(1,1,2,K,B) !1=1/2+ …
PRINT C;"通り"
END
EXTERNAL SUB try(P,R,A,K,B()) !バックトラック法で検索する
OPTION ARITHMETIC RATIONAL !有理数モード
IF P=K THEN !最後の項なら
IF NUMER(R)=1 THEN !単位分数なら
LET C=C+1
FOR i=1 TO K-1 !結果を表示する
PRINT "+1/";STR$(B(i));
NEXT i
PRINT "+1/";STR$(DENOM(R))
END IF
ELSE
FOR i=A TO (K-P+1)/R !項数がm個のとき、R=1/a+1/b+ … +1/c≦m/aより
LET B(P)=i !p項目
LET S=R-1/i !残り
IF S>0 THEN CALL try(P+1,S,i,K,B) !次へ
NEXT i
END IF
END SUB
異なる単位分数の和では、
サブルーチン部分を、
EXTERNAL SUB try(P,R,A,K,B()) !バックトラック法で検索する
OPTION ARITHMETIC RATIONAL !有理数モード
IF P=K THEN !最後の項なら
IF NUMER(R)=1 AND DENOM(R)>B(K-1) THEN !単位分数なら
LET C=C+1
FOR i=1 TO K-1 !結果を表示する
PRINT "+1/";STR$(B(i));
NEXT i
PRINT "+1/";STR$(DENOM(R))
END IF
ELSE
FOR i=A TO (K-P+1)/R !項数がm個のとき、R=1/a+1/b+ … +1/c≦m/aより
LET B(P)=i !p項目
LET S=R-1/i !残り
IF S>0 THEN CALL try(P+1,S,i+1,K,B) !次へ
NEXT i
END IF
END SUB
と改修する。
|
|