覆面算 ABCDEF*G=FABCDE

 投稿者:山中和義  投稿日: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
 

Re: 覆面算 ABCDEF*G=FABCDE

 投稿者:山中和義  投稿日: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
 

戻る