投稿者:山中和義
投稿日:2011年 6月25日(土)11時51分8秒
|
|
|
問題
覆面算 ABCDEF*G=FABCDE
問題
n桁の自然数ABC…XYZがある。
1桁の自然数k≠1をかけると、ABC…XYZ*k=ZABC…XYになる数が存在するときのnは?
答え
(k*10-1)*ABC…XYZ = ZABC…XY0 - ABC…XYZ = Z00…00 - Z = (100…00-1)*Z = 99…99*Z(n個の9)
1桁の自然数k≠1より、(k*10-1)=19,29,39,49,59,69,79,89は、99…99*Zを割り切る必要がある。
Z=0,1,2,…,9として、割り切る(k*10-1)で、n桁の
ABC…XYZ=99…99*Z/(k*10-1)
ZABC…XY=(99…99*Z + ABC…XYZ)/10
を得る。
OPTION ARITHMETIC RATIONAL !多桁の整数
LET t0=TIME
FOR n=1 TO 100
LET Q=10^n-1 !99…99(n個の9)
PRINT "n=";n; Q
FOR Z=0 TO 9
LET QZ=Q*Z
FOR k=2 TO 9 !19,29,39,…,89
LET x=k*10-1
IF MOD(QZ,x)=0 THEN !割り切れるなら
LET ABCXYZ=QZ/x !復元する
IF INT(ABCXYZ/10^(n-1))>0 THEN !n桁の自然数なら
LET ZABCXY=(QZ+ABCXYZ)/10
IF ABCXYZ*k=ZABCXY THEN !題意を満たす
PRINT ABCXYZ; k; ZABCXY
ELSE
PRINT "論理エラーです。"
STOP
END IF
!!!PRINT ABCXYZ; k; ZABCXY !題意を満たす
END IF
END IF
NEXT k
NEXT Z
NEXT n
PRINT "計算時間=";TIME-t0
END
|
|
|
投稿者:山中和義
投稿日:2011年 6月26日(日)12時31分54秒
|
|
|
> No.1592[元記事へ]
巡回数(サイクルナンバー Cyclic number、ダイヤル数)
何倍かすると、数字並びが巡回するもの
問題
k倍して桁が巡回する自然数を求めよ。
6桁の場合
ABCDEF*kの計算結果が以下のいずれかになる。
FABCDE
EFABCD
DEFABC
CDEFAB
BCDEFA
例
102564 * 4 = 410256
142857 * 5 = 714285
142857 * 3 = 428571
109890 * 9 = 989010 など
答え
2桁以上をかけると桁数が増えるので、1桁の自然数k≠1をかける。
(k*100-1)*ABCDEF = (ABCDEF*k)*100 - ABCDEF = EF000000 - EF = EF*(10^6-1) = EF*999999
(k*1000-1)*ABCDEF = (ABCDEF*k)*1000 - ABCDEF = DEF000000 - DEF = DEF*(10^6-1) = DEF*999999
次のように半分以降も同様だが、逆のローテイトを考えた方がよい。
CDEF0000000 - CDEF = CDEF*(10^6-1) = CDEF*999999
BCDEF000000 - BCDEF = BCDEF*(10^6-1) = BCDEF*999999
したがって、
ABCDEF*k=CDEFABの場合
(100-k)*ABCDEF = (ABCDEF)*100 - (ABCDEF*k) = AB000000 - AB = AB*(10^6-1) = AB*999999
ABCDEF*k=BCDEFAの場合
(10-k)*ABCDEF = (ABCDEF)*10 - (ABCDEF*k) = A000000 - A = A*(10^6-1) = A*999999
●右ローテイト
!問題
!虫食い算(覆面算) ABCDEF*G=FABCDE
OPTION ARITHMETIC RATIONAL !多桁の整数
LET t0=TIME
LET S=1 !右シフト数 ※1≦S≦INT((n+1)/2)
FOR n=1 TO 100
LET Q=10^n-1 !99…99(n個の9)
PRINT "n=";n; Q
FOR Z=0 TO 10^MOD(S,n)-1 !9
LET QZ=Q*Z
FOR k=2 TO 9 !19,29,39,…,89
LET x=k*10^MOD(S,n)-1
IF MOD(QZ,x)=0 THEN !割り切れるなら
LET ABCXYZ=QZ/x !復元する
LET t=INT(ABCXYZ/10^(n-1)) !n桁の自然数なら
IF t>0 AND t<10 THEN
LET ZABCXY=(QZ+ABCXYZ)/10^MOD(S,n) !復元する
LET t=INT(ZABCXY/10^(n-1)) !n桁の自然数なら
IF t>0 AND t<10 THEN
IF ABCXYZ*k=ZABCXY THEN !題意を満たす(念のため)
PRINT ABCXYZ; k; ZABCXY
ELSE
PRINT "論理エラーです。"
STOP
END IF
!!!PRINT ABCXYZ; k; ZABCXY !題意を満たす
END IF
END IF
END IF
NEXT k
NEXT Z
NEXT n
PRINT "計算時間=";TIME-t0
END
●左ローテイト
!問題
!虫食い算(覆面算) ABCDEF*G=BCDEFA
OPTION ARITHMETIC RATIONAL !多桁の整数
LET t0=TIME
LET S=1 !左シフト数 ※1≦S≦INT((n+1)/2)
FOR n=1 TO 100
LET Q=10^n-1 !99…99(n個の9)
PRINT "n=";n; Q
FOR A=0 TO 10^MOD(S,n)-1 !9
LET QA=Q*A
FOR k=2 TO 9 !8,7,6,…,1
LET x=10^MOD(S,n)-k
IF MOD(QA,x)=0 THEN !割り切れるなら
LET ABCXYZ=QA/x !復元する
LET t=INT(ABCXYZ/10^(n-1)) !n桁の自然数なら
IF t>0 AND t<10 THEN
LET BCXYZA=(ABCXYZ*10^MOD(S,n)-QA) !復元する
LET t=INT(BCXYZA/10^(n-1)) !n桁の自然数なら
IF t>0 AND t<10 THEN
IF ABCXYZ*k=BCXYZA THEN !題意を満たす(念のため)
PRINT ABCXYZ; k; BCXYZA
ELSE
PRINT "論理エラーです。"
STOP
END IF
!!!PRINT ABCXYZ; k; BCXYZA !題意を満たす
END IF
END IF
END IF
NEXT k
NEXT A
NEXT n
PRINT "計算時間=";TIME-t0
END
|
|
|
投稿者:山中和義
投稿日:2011年 6月27日(月)11時38分31秒
|
|
|
> No.1592[元記事へ]
> 問題
> n桁の自然数ABC…XYZがある。
> 1桁の自然数k≠1をかけると、ABC…XYZ*k=ZABC…XYになる数が存在するときのnとABC…XYZは?
6桁の場合
(k*10-1)*ABCDEF = (ABCDEF*k)*10 - ABCDEF = 999999*F
∵
FABCDE0
-) ABCDEF
----------
F000000 - F = (10^6-1)*F = 999999*F
∴ABCDEF/999999=F/(k*10-1) ← 式(1)
また
循環節6の循環小数X=0.{ABCDEF}、A≠0とする。
10^6*X - X = ABCDEF.{ABCDEF} - 0.{ABCDEF} = ABCDEF
左辺=(10^6-1)*X=999999*Xより、ABCDEF/999999=X ← 式(2)
式(1),(2)を比較すると、F/(k*10-1)が循環節6の循環小数になることを示唆する。
これを見つけるには、F=0~9、k=1~9で、検索すればよい。
実際には
分子Fは、計算結果として0は該当しないので、F=1~9
分母 k*10-1 は、9,19,29,39,49,59,69,79,89
6桁のため、小数点第一位は0でない。すなわち、F≧k
として、
F k*10-1 結果
4 39 0.{102564}
5 39 0.{128205}
6 39 0.{153846}
7 39 0.{179487}
7 49 0.{142857}
8 39 0.{205128}
9 39 0.{230769}
となる。
●サンプル・プログラム
!ABC…XYZ*k=ZABC…XYの基本形
LET t0=TIME
FOR k=1 TO 9 !素因数19,29,39,49,59,69,79,89
LET x=10*k-1
PRINT "k=";k
FOR Z=k TO 9 !Z≧k
IF Z<x THEN !真分数 Z/(10*k-1) を
PRINT Z;"/";x;"= "; !循環小数で表す
CALL recuring(Z,x)
END IF
NEXT Z
PRINT
NEXT k
PRINT "計算時間=";TIME-t0
END
!参考 Math フォルダ内 RECURING.BAS
EXTERNAL SUB recuring(a,b) !a/bを循環小数に直す。ただし,a<bとする 。
LET radix=10 !基数
DIM q(1 TO 1000) !商の各位の数
DIM r(0 TO 1000) !余りの各位の数
LET r(0)=a
LET k=1 !小数点以下の桁位置
DO
LET q(k)=int(r(k-1)*radix/b)
LET r(k)=MOD(r(k-1)*radix,b)
LET j=0
DO UNTIL j=k-1 OR r(j)=r(k)
LET j=j+1
LOOP
IF r(j)=r(k) THEN EXIT DO
LET k=k+1
LOOP
! 結果の表示
PRINT "0.";
FOR i=1 TO j
PRINT q(i);
NEXT i
PRINT "{"; !循環節を{と}で括って表示する
FOR i=j+1 TO k
PRINT STR$(q(i));
NEXT i
PRINT "}"; " 循環節=";k
END SUB
●実行結果
k= 1
1 / 9 = 0.{1} 循環節= 1
2 / 9 = 0.{2} 循環節= 1
3 / 9 = 0.{3} 循環節= 1
4 / 9 = 0.{4} 循環節= 1
5 / 9 = 0.{5} 循環節= 1
6 / 9 = 0.{6} 循環節= 1
7 / 9 = 0.{7} 循環節= 1
8 / 9 = 0.{8} 循環節= 1
k= 2
2 / 19 = 0.{105263157894736842} 循環節= 18
3 / 19 = 0.{157894736842105263} 循環節= 18
4 / 19 = 0.{210526315789473684} 循環節= 18
5 / 19 = 0.{263157894736842105} 循環節= 18
6 / 19 = 0.{315789473684210526} 循環節= 18
7 / 19 = 0.{368421052631578947} 循環節= 18
8 / 19 = 0.{421052631578947368} 循環節= 18
9 / 19 = 0.{473684210526315789} 循環節= 18
k= 3
3 / 29 = 0.{1034482758620689655172413793} 循環節= 28
4 / 29 = 0.{1379310344827586206896551724} 循環節= 28
5 / 29 = 0.{1724137931034482758620689655} 循環節= 28
6 / 29 = 0.{2068965517241379310344827586} 循環節= 28
7 / 29 = 0.{2413793103448275862068965517} 循環節= 28
8 / 29 = 0.{2758620689655172413793103448} 循環節= 28
9 / 29 = 0.{3103448275862068965517241379} 循環節= 28
k= 4
4 / 39 = 0.{102564} 循環節= 6
5 / 39 = 0.{128205} 循環節= 6
6 / 39 = 0.{153846} 循環節= 6
7 / 39 = 0.{179487} 循環節= 6
8 / 39 = 0.{205128} 循環節= 6
9 / 39 = 0.{230769} 循環節= 6
k= 5
5 / 49 = 0.{102040816326530612244897959183673469387755} 循環節= 42
6 / 49 = 0.{122448979591836734693877551020408163265306} 循環節= 42
7 / 49 = 0.{142857} 循環節= 6
8 / 49 = 0.{163265306122448979591836734693877551020408} 循環節= 42
9 / 49 = 0.{183673469387755102040816326530612244897959} 循環節= 42
k= 6
6 / 59 = 0.{1016949152542372881355932203389830508474576271186440677966} 循環節= 58
7 / 59 = 0.{1186440677966101694915254237288135593220338983050847457627} 循環節= 58
8 / 59 = 0.{1355932203389830508474576271186440677966101694915254237288} 循環節= 58
9 / 59 = 0.{1525423728813559322033898305084745762711864406779661016949} 循環節= 58
k= 7
7 / 69 = 0.{1014492753623188405797} 循環節= 22
8 / 69 = 0.{1159420289855072463768} 循環節= 22
9 / 69 = 0.{1304347826086956521739} 循環節= 22
k= 8
8 / 79 = 0.{1012658227848} 循環節= 13
9 / 79 = 0.{1139240506329} 循環節= 13
k= 9
9 / 89 = 0.{10112359550561797752808988764044943820224719} 循環節= 44
計算時間= 3.35
|
|
|
戻る