• 締切済み

解説をお願いします

解説をお願いします。 次のプログラミングの解説をお願いします。 #include<stdio.h> int main(void) int n,m,x; char my_turn; printf("最後にタバスコを取った側がピザを食べます\n"); printf("タバスコの数?"); scanf("%d",&n); printf("1回にタバスコを振れる最大の数?"); scanf("%d",&m); if(n < 1 || m < 1) return 0;//負数の入力を拒否します for(my_turn = 1; n!=0; my_turn ^=1){ *1 if(my_turn){ x = (n - 1)%(m + 1);//なぜこの様な式になるのかを特に教えてください。 if(x == 0) x =1; printf("私は %d 回タバスコを振ります\n",x); }else do{ printf("何回振りますか?"); scanf("%d",&x); }while(x <= 0 || x > m || x > n); n = n - x; printf("残りは %d 回です\n",n); } if(my_turn) printf("あなたの負けです\nおいしく召し上がれ"); else printf("私の負けです\nいただきます"); return 0; }

みんなの回答

  • mtaka2
  • ベストアンサー率73% (867/1179)
回答No.1

> x = (n - 1)%(m + 1);//なぜこの様な式になるのかを特に教えてください。 この部分の計算の意味がわからないということでしょうか? だとしたら、これはC言語の問題ではなく、思考ルーチンの問題です。 例えば、「1回にタバスコを振れる最大の数」が3だとします。 このとき、 ・残り5滴にして相手に回せば、必勝です。   ・相手が1滴振ったら、こちらは3滴振ることで、残り1滴になり、相手が最後のタバスコを取る羽目になる。   ・相手が2滴振ったら、こちらは2滴振ることで、残り1滴になり、相手が最後のタバスコを取る羽目になる。   ・相手が3滴振ったら、こちらは1滴振ることで、残り1滴になり、相手が最後のタバスコを取る羽目になる。 ・残り9滴にして相手に回せば、必勝です。   ・相手が1滴振ったら、こちらは3滴振ることで、残り5滴になる。   ・相手が2滴振ったら、こちらは2滴振ることで、残り5滴になる。   ・相手が3滴振ったら、こちらは1滴振ることで、残り5滴になる。 ・以下、残数が「4の倍数+1」滴にして相手に回せば、必勝です。 このとき、選ぶべき滴数を式にするならば、「(残りの滴数-1)を4で割った余り」の滴数選べば必勝ということになります。 (残り10滴なら、(10-1)=9を4で割った余りである1滴を選ぶと、残り9滴になる) さらに、一回に取れる滴数の最大値を3滴で説明しましたが、一般的に言うと、 「(残りの滴数-1)を(一回の最大滴数+1)で割った余り」を選べばいいということになります。 それを式にすると、「(n - 1)%(m + 1)」になります。

関連するQ&A