プロが教える店舗&オフィスのセキュリティ対策術

 練習問題 5-15
 2以上の数値を入力し、素因数分解した結果を表示しなさい。
1) int n, x;

2) scanf("%d", &n );
3) for( x = 2 ; n > 1 ; x++ ){ /*for解説コメントをお願いします。*/
4) while( ( n % x ) == 0 ){
5) printf( "%d ", x );
6) n /= x;
}
}
 以上のプログラムですが、100と入力すると→2 2 5 5と表示されます。
 5と入力すると→5と表示されます。どこのプログラムで5は5しか割り切れないと
 判断しているのでしょうか?
 宜しくお願いします。

A 回答 (5件)

> 3) for( x = 2 ;・・・とあり、


> 5)printf( "%d ", x );のxは2なので
> → printfは2しか表示しないのでは、と思うのですが、
> 実際は 違います!どうしてでしょうか?

ANo.2において次のように回答済み↓

 最初のforループでは,x=2,
  4) 5%2≠0 なので 5) 6) は実行しない。

この回答への補足

「printfは2しか表示しないのでは、と思うのですが」
 私の勘違いでした。3)のX++~Xは2以上の数字へと変化します^^

補足日時:2011/07/20 05:34
    • good
    • 0
この回答へのお礼

皆様御回答ありがとうございました^^特にjjon-com様、私のような素人の疑問に御丁寧に詳く御回答いただき誠にありがとうございます。
私も質問することで、一つ理解すと、又新たな疑問が湧いてきます。
 簡単なプログラムだと文字では感じ取れるのですが、裏方では複雑
な取り決めがあるのですね。
 また、プログラムは連鎖的だと最近思うようになりました。
完ぺきではないのですが!ここで一度閉めて、再度質問したいと思います。
 皆様今後とも 宜しくお願い致します。
 

お礼日時:2011/07/20 05:54

「n /= x」は「n = n / x」と同じ意味です。

下記ページの解説を参照。
http://9cguide.appspot.com/05-01.html#S6

for文や代入演算子など C言語の基本的な文法の理解が不十分なようでしたら,次のまとまった解説を最初から通し読みした方が,十分ボリュームがあるようでも理解は早いように思います。急がば回れ,ということですね。
http://9cguide.appspot.com/

この回答への補足

ご回答誠にありがとうございました。
A;「n /= x」は「n = n / x」と同じ意味
 了解しました。
ご紹介のURL全て読みました。すごくわかり安解説です。
 私ごとですが、応用面が弱いので弱いところは頑張るしかないです・・
jjon-com様の御解説を再度解析中ですが、
 新たな疑問が生まれました。
 何だそんな質問するな!と思われる方ともいると思いますが!
3) for( x = 2 ;・・・とあり、5)printf( "%d ", x );のxは2なので→ printfは2しか表示しないのでは、と思うのですが、実際は
違います!どうしてでしょうか?宜しければ御解説をお願い致します。

補足日時:2011/07/13 05:35
    • good
    • 0

コンピューターになったつもりで、1行ずつ実行してみればよいと思います。

    • good
    • 0

> 3) for( x = 2 ; n > 1 ; x++ ){ /*for解説コメントをお願いします。

*/

初期値…変数xの値を2から開始して
増分…ループを終えるたびにxの値を1つずつ加算して,
継続条件…変数nの値が1より大きい場合にループし続ける
  (言い換えれば,nが1以下になったらループを終える)


> 4) while( ( n % x ) == 0 ){

nをxで割った余り=0 が成り立つ間,5) 6) をループし続ける。
言い換えれば,nをxで割った余り≠0 ならループを終える。


>どこのプログラムで5は5しか割り切れないと判断しているのでしょうか?

最初のforループでは,x=2,
4) 5%2≠0 なので 5) 6) は実行しない。

次のforループでは,x=3,
4) 5%3≠0 なので 5) 6) は実行しない。

次のforループでは,x=4,
4) 5%4≠0 なので 5) 6) は実行しない。

次のforループでは,x=5,
4) 5%5≠0 なので
5) で「5」を表示して,
6) で「n←5÷5の商」すなわち「n←1」

次のforループの開始時点で n>1 が成り立たなくなるので,
forループを終了して,プログラム終了。

この回答への補足

ご回答ありがとございました。
> 3) for( x = 2 ; n > 1 ; x++ ){ /*for解説コメントをお願いします。*/
は以前質問した履歴が残っていまして、失礼しました。
 
 現在ご回答を現在解析中ですが、
 「 6) n /= x; 」はどんな意味でしょうか
私が持っている教本には似たような式がございます。
教本には「a = b / c 」はとあり、「bをcで割った値をaに代入」とわありますが
 違うみたいです。
 すみません又、宜しくお願いします。

補足日時:2011/07/12 05:41
    • good
    • 0

> 100と入力すると→2 2 5 5


の方は理解できてますか?

> 5と入力すると→5
なのは、素因数分解した結果がたまたま5だけだった、というだけです。
「5は5しか割り切れない」というような特別な判定はしていません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!