Structured Program II - How many ways?
はい。
http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=ITP1_7_B
1 から n までの数の中から、重複無しで3つの数を選びそれらの合計が x となる組み合わせの数を求める というので3重ループで書いていたのだが他の人の回答を見たら2重ループに出来る方法があって感動したので書いておくことに。
・3重ループの場合
for i in range(1,n-1): for j in range(i+1,n): for k in range(j+1,n+1): if i+j+k==x:ans+=1 print ans
2重、3重がi+1,j+1から開始なのは重複なしの3つの数を使うためです。この3重目が1ずつ加算してxになる数を探すということをする必要が全くなかった。
・2重ループの場合
for i in range(1,n-1): for j in range(i+1,n): #xからiとjを引くことで3つの和がxと等しくなるための数が求まりcに代入しておく c=x-i-j #cがjより大きく(c==jだと3つの数の中で重複が有って、c<jだと数え上げる組合せに重複が出るため)、 #cがn以下(3つ目の数はn以下でないと条件の範囲外になる)であれば組合せを1つ加算して次のループに行く。 if c>j and c<=n:a+=1 print a