• ベストアンサー

for文を使ったプログラムで困っています

for文を使って、10000からある数xを何回引けるか?またその残りを求めるプログラム(例:10000から3000は3回引くことができ、残りは1000である。)を作りたいのですが、引く回数が1多くなってしまいます。どこがいけないかわからないので困っています。よろしくおねがいします。 #include<stdio.h> void main() { int x; int Sa = 10000; int y; printf("10000以下の数を入力してください:"); scanf("%d",&x); for(y = 1; y*x <= 10000 ; y++) { Sa = Sa - x; } printf("10000から%d回引くことができます。\n",y); printf("残りは%dです。",Sa); }

質問者が選んだベストアンサー

  • ベストアンサー
  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.2

x=3000のとき、 y=1,y*x<=10000を満たすのでSa=Sa-xを実行し、Sa=7000 yをインクリメントし、y=2 y*x<=10000を満たすのでSa=Sa-xを実行し、Sa=4000 yをインクリメントし、y=3 y*x<=10000を満たすのでSa=Sa-xを実行し、Sa=1000 yをインクリメントし、y=4 y*x<=10000を満たさないので、ループから抜ける という風に、yが(引ける回数+1)になったときにループを抜けます。 単純に、ループから抜けた後でyをデクリメントすればよいのではないでしょうか。

bookers628
質問者

お礼

なるほど!この場合は、10000より大きいときにループを抜け出す。 つまりy=4じゃないとループを抜けないから、4が返ってくるんですね。 ありがとうございます。yをデクリメントします。

その他の回答 (3)

回答No.4

例えば、 x=3000だとすると、 y*x<=10000を満たすのは、y=4なので、 必然的に引く回数が1つ多くなりますよね。 for文で作成したい場合は、 for(y = 1; y*x <= 10000 ; y++) { Sa = Sa - x; } if(Sa<0){ y = y -1; } でどうでしょうか? 美しくないですが・・・

bookers628
質問者

お礼

なるほど!この場合は、10000より大きいときにループを抜け出す。 つまりy=4じゃないとループを抜けないから、4が返ってくるんですね。 ありがとうございます。y-1を追加します。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.3

>引く回数が1多くなってしまいます。 >どこがいけないかわからないので困っています。 いやいや、もうわかっているではないですか。 引く回数よりも1回多くカウントしているでしょう? というか、ループの終了条件が x*y <= 10000 と「わかっている」なら わざわざループをまわす必要はないですよね。 何かの演習問題だと思いますけど、出題意図を考えた方がよいかもしれません。

bookers628
質問者

補足

演習問題です。 for文を使うことが条件なので…

  • Tasuke22
  • ベストアンサー率33% (1799/5383)
回答No.1

y=1をy=0に修正です。 意味はよーく考えて、補足か何かで聞いてみましょう。