問題
3桁の自然数の各桁の数字の和が12となる場合の数を求めて下さい。
解法1 思い付いた順
3桁の整数をabcとすると、a+b+c=12
ここで、a,b,cの限定を解除して考えると、重複組み合わせの定石問題なので場合の数は、
3H12=3+12-1C12=14C12=14C2=14・13/2=91通り
しかし、これは限定解除した上に百の位の0も入れてしまっている値である。
そこで、重複組み合わせの原理を考えて、A,B,Cの3つの箱から重複を許して12個を取り出す組み合わせは91通りであるが、初めにaにだけ1個確保しておくと、
A,B,Cの3つの箱から重複を許して11個を取り出す組み合わせで、百の位の0を除いた値が出る。つまり、
3H11=3+11-1C11=13C11=13C2=13・12/2=78通り
これから、十の位と一の位の10以上の場合を除く。
(1,1,10),(2,0,10),(1,0,11),(12,0,0)で全てである。
(1,1,10)は入れ換え3通り。
(2,0,10)は百の位の0を除いた入れ換え4通り。
(1,0,11)も百の位の0を除いた入れ換え4通り。
(12,0,0)はこれ1通り。
よって、計3+4+4+1=12通り
よって、答えは、78-12=66通り
解法2 数え上げ。
129の入れ換え6通り。
138の入れ換え6通り。
147の入れ換え6通り。
156の入れ換え6通り。
228の入れ換え3通り。
237の入れ換え6通り。
246の入れ換え6通り。
255の入れ換え3通り。
336の入れ換え3通り。
345の入れ換え6通り。
444は1通り。
039は百の位の0を除いた入れ換え4通り。
048は百の位の0を除いた入れ換え4通り。
057は百の位の0を除いた入れ換え4通り。
066は百の位の0を除いた入れ換え2通り。
よって、6×7+4×3+3×3+2+1
=42+12+9+3=54+12=66通り
よって、答えは、66通り
または、039などを6通り、066を3通りと考えて、百の位が0になる場合の数2+2+2+1=7通りを全体から引いても良い。その場合は、
6×10+3×4+1-7=60+12-6=66通り
解法3 pythonはいいですね。(邪道解)
count = 0
ans = [ ]
for a in range(1,10):
for b in range(0,10):
for c in range(0,10):
if a + b + c == 12:
ans.append((a,b,c))
count += 1
print('場合の数は{0}通り,{1}'.format(count,ans))
結果:場合の数は66通り,[(1, 2, 9), (1, 3, 8), (1, 4, 7), (1, 5, 6), (1, 6, 5), (1, 7, 4), (1, 8, 3), (1, 9, 2), (2, 1, 9), (2, 2, 8), (2, 3, 7), (2, 4, 6), (2, 5, 5), (2, 6, 4), (2, 7, 3), (2, 8, 2), (2, 9, 1), (3, 0, 9), (3, 1, 8), (3, 2, 7), (3, 3, 6), (3, 4, 5), (3, 5, 4), (3, 6, 3), (3, 7, 2), (3, 8, 1), (3, 9, 0), (4, 0, 8), (4, 1, 7), (4, 2, 6), (4, 3, 5), (4, 4, 4), (4, 5, 3), (4, 6, 2), (4, 7, 1), (4, 8, 0), (5, 0, 7), (5, 1, 6), (5, 2, 5), (5, 3, 4), (5, 4, 3), (5, 5, 2), (5, 6, 1), (5, 7, 0), (6, 0, 6), (6, 1, 5), (6, 2, 4), (6, 3, 3), (6, 4, 2), (6, 5, 1), (6, 6, 0), (7, 0, 5), (7, 1, 4), (7, 2, 3), (7, 3, 2), (7, 4, 1), (7, 5, 0), (8, 0, 4), (8, 1, 3), (8, 2, 2), (8, 3, 1), (8, 4, 0), (9, 0, 3), (9, 1, 2), (9, 2, 1), (9, 3, 0)]
おまけ: