素因数分解プログラムで5は5と表示される理由は?

このQ&Aのポイント
  • 素因数分解プログラムで5は5と表示される理由について、解説します。
  • プログラムの説明として、2以上の数値を入力し、素因数分解した結果を表示するコードを使用しています。
  • プログラムの実行結果として、入力した数値が5の場合は5と表示されます。
回答を見る
  • ベストアンサー

素因数分解プログラムで、5は5と表示するのは?

 練習問題 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しか割り切れないと  判断しているのでしょうか?  宜しくお願いします。

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

  • ベストアンサー
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.5

> 3) for( x = 2 ;・・・とあり、 > 5)printf( "%d ", x );のxは2なので > → printfは2しか表示しないのでは、と思うのですが、 > 実際は 違います!どうしてでしょうか? ANo.2において次のように回答済み↓  最初のforループでは,x=2,   4) 5%2≠0 なので 5) 6) は実行しない。

gogatunijyuku
質問者

お礼

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

gogatunijyuku
質問者

補足

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

その他の回答 (4)

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.4

「n /= x」は「n = n / x」と同じ意味です。下記ページの解説を参照。 http://9cguide.appspot.com/05-01.html#S6 for文や代入演算子など C言語の基本的な文法の理解が不十分なようでしたら,次のまとまった解説を最初から通し読みした方が,十分ボリュームがあるようでも理解は早いように思います。急がば回れ,ということですね。 http://9cguide.appspot.com/

gogatunijyuku
質問者

補足

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

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

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

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.2

> 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ループを終了して,プログラム終了。

gogatunijyuku
質問者

補足

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

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

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

関連するQ&A

  • 素因数プログラムで、間違えて因数4で割らない

    練習問題 5-15  2以上の数値を入力し、素因数分解した結果を表示しなさい。    疑問ですが、素因数分解なので割る数字は、2.3.5.7.・・・の自分の数字しか割りきれない数字で  割ります。それでは、以下のプログラムはどこでそれを判断しているのでしょか?  4で割ろうとしないのは、どこのプログラムが司っているのでしょうか  もし!見えない取り組みがあれば宜しくお願いします。  以下プログラムです。 1) int n, x; 2) scanf("%d", &n ); 3) for( x = 2 ; n > 1 ; x++ ){ 4) while( ( n % x ) == 0 ){ 5) printf( "%d ", x ); 6) n /= x; } }

  • プログラムの解説をお願いします。

    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; } }  全て解説を頼むと考えなくなるため、3) の解説をお願いします。

  • 素因数分解のプログラムを作成しました。

    素因数分解のプログラムを作成しました。 なぜか11桁を超えた場合、正しく表示されません!! アドバイス等お願いします。 あと、処理時間も組んでみましたがこちらもうまくいきません。 改善をお願いしますm(_ _)m #include<stdio.h> #include<time.h> void fanction(int); void main(void) { int n; clock_t start_time, end_time; printf("整数を入力してください。\n"); scanf("%d",&n); start_time = clock(); fanction(n); end_time = clock(); printf("\n\n処理時間:%.3f秒\n",(double)(end_time - start_time) / CLOCKS_PER_SEC); return 0; } void fanction(int n) { int m; char c='='; for(m=2;n != 1;m++) { while(n%m == 0) { n = n/m; printf("%c%d",c,m); c='*'; } } }

  • 素数を判定するプログラム

    整数をひとつ入力して、それが素数かどうかを判定するプログラムを作ったのですが、素数でないものを入力しても「素数です」といわれます。 どうもfor文が評価されていないような気がしますが、原因がわかりません。 // homework4.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include <stdio.h> int main(int argc, char* argv[]) { int number; int n = 2; int i; printf("1より大きい整数を入力してください: "); scanf("%d",&number); while (number <= 1) { printf("1より大きい整数を入力してください: "); scanf("%d",&number); } if (number == 2) { printf("%dは素数です\n",number); goto OUT; } else { for (; n == number - 1; n++) { i = number % n; if (i == 0) printf("%dは素数ではありません\n", number); if (i == 0) goto OUT; } } printf("%dは素数です\n", number); OUT: return 0; } どうかよろしくお願いします。

  • プログラムがエラーが出る原因

    以下のプログラムがエラーが出る原因を教えてください。 2以上の数値を入力し、素因数分解した結果を表示するプログラム。 #include <stdio.h> int main() { int n, x; scanf("%d", &n );/* for( x = 2 ; n > 1 ; x++ ){ while( ( n % x ) == 0 ){ printf( "%d ", x ); n /= x; } } return 0; } エラー表示 $ gcc s.c -o s.exe s.c:6:18: unterminated comment s.c: In function `main': s.c:6: error: syntax error at end of input 環境 1) テキストエディタ→秀丸   秀丸のファイル保存方法  ・ファイル名→C言語ソースファイル(*c) ・エンコードの種類→自動判定ー日本語(Shift-Jis) ・改行コード→自動(変更なし) 2) コンパイルソフト →MinGW 3) シェル→MSYS

  • プログラムについて教えて下さい。

    ある値を入力し、0以上100以下のときだけ平方根を計算するプログラムで、負の値や100よりも大きな値を入力したときは何も表示せず、 再度入力するようなプログラムを教えて下さい。 #include <stdio.h> #include <math.h> main() { int n,i; printf("0から100までの値を入力してください。"); scanf("%d",&n); i=0; do{ i++;} while(i<=100); if(100>=0) printf("%dの平方根は%dです。\n",n,sqrt(i)); return(0); } どうか、お願いします。

  • 因数分解プログラム(C言語)について(1)

    ”因数分解を行うプログラムについて”の質問と同じ者です。 みなさんのご回答を参考にして、作ってみたのですが、 ポインタとかの使い方などがわからず、実行すると、 不正な処理を行ったので終了しますとなってしまいます。 どなたか、具体的にどこが悪いのか、 そしてどのように直せば正しく実行されるのか、 教えて下さい。お願いします。 以下↓がプログラムです。 800文字以上のため二つに分割しました。 #include <stdio.h> #include <math.h> #include <process.h> /*関数プロトタイプ宣言*/ int input(int *,int *,int *); int judge(int *,int *,int *); int bunkai1(int *,int *,int *,int *,int *,float *); int bunkai2(int *,int *,int *,int *,int *,float *); int yakubun1(int *,int *,int *,int *,int *,int *,int *); int yakubun2(int *,int *,int *,int *,int *,int *,int *); int output(int *,int *,int *,int *); /*関数の呼び出し*/ int main(void) { int a,b,c,q,n1,m1,min1,flag,i,d,e,m2,n2,min2,f,g; float D; input(&a,&b,&c); judge(&a,&b,&c); bunkai1(&a,&b,&q,&n1,&m1,&D); bunkai2(&a,&b,&q,&n2,&m2,&D); yakubun1(&m1,&n1,&min1,&flag,&i,&d,&e); yakubun2(&m2,&n2,&min2,&flag,&i,&f,&g); output(&d,&e,&f,&g); return (0); } /*数値入力関数*/ int input(int *a,int *b,int *c) { printf("a*x^2+b*x+c=0で,a,b,cを入力して下さい。\n"); printf("a="); scanf("%d",a); printf("b="); scanf("%d",b); printf("c="); scanf("%d",c); if(*a == 0){ printf("a = 0なので因数分解できません。\n"); exit(1); } return 0; } つづく

  • プログラム

    下のようなプログラムを作ったのですが、10進2進変換をj=n>>2&1の部分にあるようなビットシフトではなく、 for(i=1;i<8;i++){printf("bit[%d]=%d\n",i,n%2);n=n/2;}に変えて剰余計算で行うプログラムにしたいのですが、分かる方がいましたら教えて下さい。お願いします。 #include <stdio.h> int main(void) { int i,j,n; i=2; printf("数字を入力="); scanf("%d",&n); printf("Dec=%d\n",n); printf("heX=0x%x\n",n); j=n>>2&1; printf("bit[%d]=%d\n",i,j); return(0); }

  • C言語の簡単なプログラム

    簡単な足し算のみの電卓をC言語で作っています。 /が入力されるまで足し算を繰り返すものです。 コンパイルをして、足し算を繰り返すところまでは上手くいったのですが、 /を入力してのループの抜け方がわかりません。 #include<stdio.h> int main(void) { int x=0,z; printf("数値を入力\n"); printf("終了は/を入力\n"); printf("\n結果 %d\n",x); while(1){ scanf("%d",&z); x=x+z; /* 足し算の計算 */ printf("結果 %d\n",x); /* 現在の計算結果を表示 */ } printf("終了 結果: %d\n",x); /* 計算の終了、合計値の表示 */ return 0; } while文のなかにifでいれればいいのでしょうか? その場合、 if(z=='/') break; でいいんでしょうか? if文以外のやり方がある場合も教えていただけたらと思います。 よろしくお願いします。

  • 素数を判定するプログラム

    素数を判定するプログラムをC言語で作れという問題があったのですが、以下のものをビルドして実行したら途中で止まってしまいました。(例えば5と入力する)しかし、1以下の場合は正常にif文が評価されました。 // homework4.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 #include <stdio.h> int main(int argc, char* argv[]) { int number; int n; int i; printf("1より大きい整数を入力してください: "); scanf("%d", &number); if (number <= 1) { printf("1より大きい整数を入力してください\a: "); scanf("%d", &number); } for (n = 2; n = number - 1; n++) { i = number % n; if (i = 0) { printf("%dは素数ではありません", number); break; } } printf("%dは素数です", number); return 0; } 自分ではどこがおかしいのかさっぱりわかりません。よろしくお願いします。