完全覆面算

 投稿者:GAI  投稿日:2009年10月31日(土)17時48分17秒
       ☐☐☐
 ☓  ☐☐☐
  -------------
    ☐☐☐
   ☐☐☐
 +☐☐☐
 ---------------
    ☐☐☐☐☐

の覆面算で☐には0~9の数字が各々2回ずつ入ります。
この3桁どうしの掛け算はなにか探せますか?
 

Re: 完全覆面算

 投稿者:山中和義  投稿日:2009年10月31日(土)19時32分26秒
  > No.697[元記事へ]

GAIさんへのお返事です。
No. 1
 179
×224
-----
 716
 358
358
-----
40096

解析に使ったプログラムを掲載します。参考にしてください。
!虫食い算

!  □□□ ← i 被乗数
! x□□□ ← j 乗数
! --------
!  □□□ ← a 途中結果1
! □□□  ← b 途中結果2
!□□□   ← c 途中結果3
!----------
!□□□□□ ← d 結果


LET t0=TIME


DEF fnFIG(x,n)=MOD(INT(x/10^n),10) !n桁目の数を得る ※0:一の位、1:十の位、2:百の位、…

LET ANSWER_COUNT=0 !解答数

DIM nm(0 TO 9),nm_sav(0 TO 9) !0~9の数字の重複を確認する

FOR i=100 TO 999 !被乗数
   MAT nm=ZER

   FOR k=0 TO 2 !重複チェック ※2つずつ
      LET t=fnFIG(i,k) !各桁の数字を得る
      IF nm(t)=2 THEN GOTO 200 !既に2つある!
      LET nm(t)=nm(t)+1
   NEXT k


   FOR j=100 TO 999 !乗数
      MAT nm_sav=nm !save it

      FOR k=0 TO 2 !重複チェック
         LET t=fnFIG(j,k)
         IF nm(t)=2 THEN GOTO 100
         LET nm(t)=nm(t)+1
      NEXT k


      LET a=i*MOD(j,10) !乗数の一の位との積
      IF a<100 OR a>999 THEN GOTO 100 !途中結果1は3桁の数?
      FOR k=0 TO 2 !重複チェック
         LET t=fnFIG(a,k)
         IF nm(t)=2 THEN GOTO 100
         LET nm(t)=nm(t)+1
      NEXT k


      LET b=i*MOD(INT(j/10),10) !乗数の十の位との積
      IF b<100 OR b>999 THEN GOTO 100 !途中結果2は3桁の数?
      FOR k=0 TO 2 !重複チェック
         LET t=fnFIG(b,k)
         IF nm(t)=2 THEN GOTO 100
         LET nm(t)=nm(t)+1
      NEXT k


      LET c=i*INT(j/100) !乗数の百の位との積
      IF c<100 OR c>999 THEN GOTO 100 !途中結果3は3桁の数?
      FOR k=0 TO 2 !重複チェック
         LET t=fnFIG(c,k)
         IF nm(t)=2 THEN GOTO 100
         LET nm(t)=nm(t)+1
      NEXT k


      LET d=i*j !被乗数*乗数=乗算結果
      IF d<10000 OR d>99999 THEN GOTO 100 !結果は5桁の数?
      FOR k=0 TO 4 !重複チェック
         LET t=fnFIG(d,k)
         IF nm(t)=2 THEN GOTO 100
         LET nm(t)=nm(t)+1
      NEXT k


      LET ANSWER_COUNT=ANSWER_COUNT+1 !解答数
      PRINT "No.";ANSWER_COUNT

      PRINT USING " ###":i !結果の表示
      PRINT USING "×###":j
      PRINT "-----"
      PRINT USING " ###":a
      PRINT USING " ### ":b
      PRINT USING "###  ":c
      PRINT "-----"
      PRINT USING "#####":d
      PRINT


100       !continue
          MAT nm=nm_sav !restore it
       NEXT j

200    !continue
    NEXT i


    PRINT "計算時間=";TIME-t0

 END
 

戻る