###前提・疑問
お世話になります。
恐ろしく長文になりそうなので外部リンク失礼いたします。
ACM/ICPC国内予選 出題
上記の問に対するコードがあるのですが、入力に対し、なぜ出力がこうなるのでしょうか。
(コード、入力および出力結果は以下に記載してあります)
入力の最後の
"0 0"
にて "break" され、その際に、
"printf("%d\n",shuffle(n,r));"
が2回続けて出力?されているように見えます。
呼び出されている "shuffle(n,r)" は手続き通り実行されて、結果を最後の "Break" でまとめて表示?されているのでしょうか。
この入力ではこのソースコードで無限ループが計2回実行されています。そしてさいごの
"0 0"
にてループを脱出し、その際、その後の"printf" は実行されないはずです。
最初から最後まで入力している間、全く出力がなく、無限ループの1ループ目で "printf" が実行されていないように見えます。
なぜこうなるのでしょうか。
自分で調べてみたところ、「Eclipseにおいて "scanf" 後の "printf" は正常に動作しない」との記述があり、解決策として間に "fflush" を挟む、というのがあったのですが、これと関係あるのでしょうか。
もしEclipse特有の症状であるなら、上記URLのようなコンテストでの出題で、それらを利用することに対して不安があるのですが…。
「一つ一つ順番に処理される」と盲目的に信じ込んでいたので、このように出力される事態が全く理解できません。自分でもどう質問していいのかわからない状態です…。
文章が支離滅裂で申し訳ありませんが、解答よろしくお願いします。
###ソースコード
C
1int shuffle(int n,int r){ 2 3 int i, deck[n+1], temp[n+1]; 4 5 for(i=1;i<=n;i++) 6 deck[i] = n-i+1; 7 8 while(r-->0){ 9 int p,c; 10 scanf("%d %d",&p,&c); 11 for(i=1;i<p;i++) 12 temp[i]=deck[i]; 13 for(i=p;i<p+c;i++) 14 deck[i-p+1]=deck[i]; 15 for(i=1;i<p;i++) 16 deck[i+c]=temp[i]; 17 } 18 19 return deck[1]; 20} 21 22int main(void){ 23 24 for(;;){ 25 int n, r; 26 scanf("%d %d",&n,&r); 27 if(n==0)break; 28 printf("%d\n",shuffle(n,r)); 29 } 30 31 return 0; 32} 33
###入力
5 2
3 1
3 1
10 3
1 10
10 1
8 3
0 0
###出力
4
4
###補足情報(言語/FW/ツール等のバージョンなど)
Eclipse Cpp Mars
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/03/13 13:24
2016/03/13 14:25 編集
2016/03/13 14:10
2016/03/13 14:36
2016/03/13 15:46