アルゴリズムの勉強をしているのですが、他の方が書いたコードの意味が分からなくて困っています。
1からnまでの数から重複しない3つの数を選び出し、足してxとなる数をカウントするプログラムです。
例えば、
nが5
xが9
であれば
1+3+5=9
2+3+4=9
で
カウントが2です。
Java
1import java.io.*; 2 3class Main { 4 public static void main(String[] args) { 5 BufferedReader kb = new BufferedReader( new InputStreamReader( System.in ) ); 6 try { 7 8 int n, x; 9 int cnt, ave3, ave2; 10 String[] tmpArray; 11 while( true ) { 12 String str = kb.readLine(); 13 tmpArray = str.split( " " ); 14 n = Integer.parseInt( tmpArray[0] ); 15 x = Integer.parseInt( tmpArray[1] ); 16 17 if( 0 == n && 0 == x ) { break; } 18 19 cnt = 0; 20 ave3 = x / 3; 21 int i, j, k; 22 for( i=1; i<ave3; i++ ) { 23 ave2 = ( x-i ) / 2; 24 for( j=i+1; j<=ave2; j++ ) { 25 k = x - i - j; 26 if( j < k && k <= n ) { 27 cnt++; 28 } 29 } 30 } 31 System.out.println( cnt ); 32 } 33 } catch( IOException e ) { 34 System.err.println( e ); 35 } 36 } 37} 38 39
わからないのは、ave3 = x / 3;と3で割っている部分と
for文のave2 = ( x-i ) / 2;とx-iを2で割っている部分と
for文以下です。
何故、これで、組み合わせの数がでるのかがわかりません。
教えて頂けると有り難いです。
あと、こういったアルゴリズムの考え方の勉強に役に立つ本やサイトとかあれば、教えて下さると助かります。
(Amazonで本を検索したのですが、どれが良いのかわかりませんでした。)
よろしくお願い致します。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/09/21 02:26