- ベストアンサー
素因数プログラムで因数4を間違えて割らなかった理由
- 素因数分解なので割る数字は、2.3.5.7.・・・の自分の数字しか割りきれない数字で割ります。
- プログラムは、4で割らないようにしている理由はありません。
- プログラムでは、2以上の数値を入力し、素因数分解した結果を表示しています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
http://okwave.jp/qa/q6868042.html の私の過去の回答ANo.2 の理解がまだ不十分なようです。 途中過程をメッセージ出力した次のコードを試してみてください。 int n, x; scanf("%d", &n); for (x = 2; n > 1; x++) { while (1) { printf("%dを%dで割ってみる...\n", n, x); if (n % x == 0) { printf("\t割り切れた\n"); n /= x; } else { printf("\t割り切れない\n"); break; } } }
その他の回答 (3)
- jjon-com
- ベストアンサー率61% (1599/2592)
> 私の変えたプログラムで何か不適切な部分がありますか? いいえ,その実行結果が私の意図していたそのものです。 > 4で割ろうとしないのは、どこのプログラムが司っているのでしょうか というご質問に対するお二人の回答者からの回答, > x=4(=2*2)にいくまでに、 > 4で割れる条件が処理されています(2で割る処理を行っています) > (4で)割ろうとしてるけど、空振りしているだけです。 という事実がその実行結果の中に現れていることがお分かりになりますか?
- hi_kurokun
- ベストアンサー率45% (20/44)
n=20を考えると(20=5*4) 以下のように動きます 1.3)でX=2 2.4)でn%x は20%2で割り切れる5)以下の処理 3.5)で2を表示 4.6)n=n/x つまり n=20/2=10 5.4)でn%x は10%2で割り切れる5)以下の処理 6.5)で2を表示 7.6)n=n/x つまり n=10/2=5 8.4)でn%x は5%2で割り切れないので3)へいく 9.3)でX=3 : このように動きます つまり4)、6)の処理で入力値nを2であまりが出るまで 割り続けています。 x=4(=2*2)にいくまでに、 4で割れる条件が処理されています(2で割る処理を行っています)
- koko_u_u
- ベストアンサー率18% (216/1139)
> 4で割ろうとしないのは、どこのプログラムが司っているのでしょうか 割ろうとしてるけど、空振りしているだけです。
お礼
ご回答ありがとうございました。 例題まで作成していただきとてもありがたことです。 流れ的なプログラムは理解できました。ループ処理されるので、最終的には自分の数字でしか割り切れないところまでプログラムが働く・・・ まだ私は完璧に理解することはできませんが、プログラムの流れは分かりました。本題で elseを使用したら、とても分かり安と思いましたが、あえて使わないことで処理能力の向上につながり、プログラムを組む上では必要なことだと思います。まだまだ練習問題が山ほどあり、素人の素朴な疑問で、ばかげた質問をすると思いますが お許しください。
補足
jjon-com様 御回答誠にありがとうございます。 私のC言語環境は OS:Win7、MinGwとMSYSです。 コンパイルできるように御紹介のプログラムを 最初と最後を追加して試しました。 残念ながら文字化けが生じてしまいましたが、化けた部分をエディタに貼り付けたら ちゃんと立派な文字があらわれて助かりました。 #include<stdio.h> int main() { int n, x; scanf("%d", &n); for (x = 2; n > 1; x++) { while (1) { printf("%dを%dで割ってみる...\n", n, x); if (n % x == 0) { printf("\t割り切れた\n"); n /= x; } else { printf("\t割り切れない\n"); break; } } } return 0; } $ d 100 100を2で割ってみる... 割り切れた 50を2で割ってみる... 割り切れた 25を2で割ってみる... 割り切れない 25を3で割ってみる... 割り切れない 25を4で割ってみる... 割り切れない 25を5で割ってみる... 割り切れた 5を5で割ってみる... 割り切れた 1を5で割ってみる... 割り切れない 以上です^^ せっかくですので、横やりの質問ですが、「100」と入力した結果ですが、 文字化けしてしまい、私の変えたプログラムで何か不適切な部分がありますか? 宜しくお願いします。