このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1269438098/553
# [1]Cプログラミング
# [2]
# 0から9までの数字を2回ずつ使用し掛け算の筆算を表示させよ
# 図
#     □□□
#   ×□□□
#   ━━━━
#    □□□
#   □□□
# □□□
#  ━━━━━
# □□□□□ 

0から9までの数字を2回ずつ使用し掛け算の筆算を表示させよ :-
      0から9までの数字を2回ずつ使用し掛け算の筆算を表示させよ([_1,_2,_3],[_4,_5,_6],[_7,_8,_9],[_10,_11,_12],[_13,_14,_15],[_16,_17,_18,_19,_20]),
      write_formatted('  %t%t%t\n',[_1,_2,_3]),
      write_formatted(' ×%t%t%t\n',[_4,_5,_6]),
      write('---------\n'),
      write_formatted('  %t%t%t\n',[_7,_8,_9]),
      write_formatted('  %t%t%t\n',[_10,_11,_12]),
      write_formatted(' %t%t%t\n',[_13,_14,_15]),
      write('---------\n'),
      write_formatted(' %t%t%t%t%t\n',[_16,_17,_18,_19,_20]).

0から9までの数字を2回ずつ使用し掛け算の筆算を表示させよ([_1,_2,_3],[_4,_5,_6],[_7,_8,_9],[_10,_11,_12],[_13,_14,_15],[_16,_17,_18,_19,_20]) :-
      乗算して桁あふれしない数字の組合せ(_1,_6),
      乗算して桁あふれしない数字の組合せ(_1,_5),
      乗算して桁あふれしない数字の組合せ(_1,_4),
      for(0,_2,9),
      for(0,_3,9),
      L6 = [_1,_2,_3,_4,_5,_6],
      一段目の掛け算(_1,_2,_3,_6,_7,_8,_9,L6,L9),
      二段目の掛け算(_1,_2,_3,_5,_10,_11,_12,L9,L12),
      三段目の掛け算(_1,_2,_3,_4,_13,_14,_15,L12,L15),
      四段目の加算(_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,L15,L20).

一段目の掛け算(_1,_2,_3,_6,_7,_8,_9,L6,L9) :-
      _9_p is _3 * _6,
      _9 is _9_p mod 10,
      二個までは許される(_9,L6,L7),
      _9_f is _9_p // 10,
      _8_p is _2 * _6 + _9_f,
      _8 is _8_p mod 10,
      二個までは許される(_8,L7,L8),
      _8_f is _8_p // 10,
      _7 is _1 * _6 + _8_f,
      _7 < 10,
      二個までは許される(_7,L8,L9),!.

二段目の掛け算(_1,_2,_3,_5,_10,_11,_12,L9,L12) :-
      _12_p is _3 * _5,
      _12 is _12_p mod 10,
      二個までは許される(_12,L9,L10),
      _12_f is _12_p // 10,
      _11_p is _2 * _5 + _12_f,
      _11 is _11_p mod 10,
      二個までは許される(_11,L10,L11),
      _11_f is _11_p // 10,
      _10 is _1 * _5 + _11_f,
      _10 < 10,
      二個までは許される(_10,L11,L12),!.

三段目の掛け算(_1,_2,_3,_4,_13,_14,_15,L12,L15) :-
      _15_p is _3 * _4,
      _15 is _15_p mod 10,
      二個までは許される(_15,L12,L13),
      _15_f is _15_p // 10,
      _14_p is _2 * _4 + 15_f,
      _14 is _14_p mod 10,
      二個までは許される(_14,L13,L14),
      _14_f is _14_p // 10,
      _13 is _1 * _4 + _14_f,
      _13 < 10,
      二個までは許される(_13,L14,L15),!.

四段目の加算(_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,L15,L20) :-
      _20 = _9,
      二個までは許される(_20,L15,L16),
      _19_p is _8 + _12,
      _19 is _19_p mod 10,
      二個までは許される(_19,L16,L17),
      _19_f is _19_p // 10,
      _18_p is _7 + _11 + _13 + _19_f,
      _18 is _18_p mod 10,
      二個までは許される(_18,L17,L18),
      _18_f is _18_p // 10,
      _17_p is _10 + _14 + _18_f,
      _17 is _17_p mod 10,
      二個までは許される(_17,L18,L19),
      _17_f is _17_p // 10,
      _16 is _15 + _17_f,
      二個までは許される(_16,L19,L20),!.

乗算して桁あふれしない数字の組合せ(0,0).
乗算して桁あふれしない数字の組合せ(0,1).
乗算して桁あふれしない数字の組合せ(0,2).
乗算して桁あふれしない数字の組合せ(0,3).
乗算して桁あふれしない数字の組合せ(0,4).
乗算して桁あふれしない数字の組合せ(0,5).
乗算して桁あふれしない数字の組合せ(0,6).
乗算して桁あふれしない数字の組合せ(0,7).
乗算して桁あふれしない数字の組合せ(0,8).
乗算して桁あふれしない数字の組合せ(0,9).
乗算して桁あふれしない数字の組合せ(1,1).
乗算して桁あふれしない数字の組合せ(1,2).
乗算して桁あふれしない数字の組合せ(1,3).
乗算して桁あふれしない数字の組合せ(1,4).
乗算して桁あふれしない数字の組合せ(1,5).
乗算して桁あふれしない数字の組合せ(1,6).
乗算して桁あふれしない数字の組合せ(1,7).
乗算して桁あふれしない数字の組合せ(1,8).
乗算して桁あふれしない数字の組合せ(2,2).
乗算して桁あふれしない数字の組合せ(2,3).
乗算して桁あふれしない数字の組合せ(2,4).
乗算して桁あふれしない数字の組合せ(3,3).
乗算して桁あふれしない数字の組合せ(1,0).
乗算して桁あふれしない数字の組合せ(2,0).
乗算して桁あふれしない数字の組合せ(3,0).
乗算して桁あふれしない数字の組合せ(4,0).
乗算して桁あふれしない数字の組合せ(5,0).
乗算して桁あふれしない数字の組合せ(6,0).
乗算して桁あふれしない数字の組合せ(7,0).
乗算して桁あふれしない数字の組合せ(8,0).
乗算して桁あふれしない数字の組合せ(9,0).
乗算して桁あふれしない数字の組合せ(2,1).
乗算して桁あふれしない数字の組合せ(3,1).
乗算して桁あふれしない数字の組合せ(4,1).
乗算して桁あふれしない数字の組合せ(5,1).
乗算して桁あふれしない数字の組合せ(6,1).
乗算して桁あふれしない数字の組合せ(7,1).
乗算して桁あふれしない数字の組合せ(8,1).
乗算して桁あふれしない数字の組合せ(3,2).
乗算して桁あふれしない数字の組合せ(4,2).

二個までは許される(A,L,_) :-
       append(_,[A|R],L),
       append(_,[A|_],R),!,fail.
二個までは許される(A,L,[A|L]).