質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

2282閲覧

c言語で素数を分けたい

to-fu

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/07/21 01:59

編集2018/07/21 04:48

前提・実現したいこと

c言語で15個以下の整数を入力して、素数判定、素数と合成数に分けてそれぞれ昇順に並べて表示させたいです。
以下のコードで実行してみてもきちんと結果が出ないのですが、どこが違うのかがさっぱりです。
具体的には、素数と合成数とにうまく分けられていないことと、ソートができていないことです。
ご教授お願いいたします。

該当のソースコード

#include <stdio.h> /* メイン関数 */ int main(void){ int N_max = 15; /* 入力できる数の上限(15)を N_max に格納 */ int prime[N_max] ,composite[N_max]; int N_p = 0, N_c = 0; /* 入力された整数の個数を格納する変数 */ int i; /* 要素番号を格納するための変数 */ int input; /* キーボードから入力された値を一時的に格納する変数 */ printf("%dこの整数? ", N_max); /* 0以下の値が入力されるかN_max個の整数が入力されるまで繰り返す */ for(i = 0; i < N_max; ++i){ scanf("%d", &input); if (input > 0){ /*素数判定*/ int j, flag = 0; for( j=2; j<input; ++j ){ if( input%j==0 ){ flag = 1; break; } } if(flag=0){ prime[N_p] = input; ++N_p; } else{ composite[N_c] = input; ++N_c; } } else{ break; } } int tmp, k; /*ソートのための変数*/ /*ソート(素数)*/ for(i=0; i<N_p; ++i){ for(k=i+1; k<N_p; ++k){ if(prime[i]>prime[k]){ tmp = prime[k]; prime[k] = prime[i]; prime[i] = tmp; } } } /*ソート(合成数)*/ for(i=0; i<N_p; ++i){ for(k=i+1; k<N_c; ++k){ if(composite[i]>composite[k]){ tmp = composite[k]; composite[k] = composite[i]; composite[i] = tmp; } } } /* 表示 */ printf("素数\n"); for(i=0; i<N_p; ++i){ printf("%d ", prime[i]); } printf("\n"); printf("合成数\n"); for(i=0; i<N_c; ++i){ printf("%d ", composite[i]); } printf("\n"); return 0; /* 戻り値として 0 を返す */ } /* main 関数の終わり */

期待する結果

15この整数? 9 8 7 6 5 4 3 2 0
素数
2 3 5 7
合成数
4 6 8 9

出てくる結果

15この整数? 9 8 7 6 5 4 3 2 0
素数

合成数
9 8 7 6 5 4 3 2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

episteme

2018/07/21 02:06

「きちんと結果が出ない」を説明せよ。どんな結果を期待し、実際にはどうなるのか。
to-fu

2018/07/21 02:56

すみません。追記させていただきました。よろしくお願い致します。
guest

回答1

0

ベストアンサー

C

1 for( j=1; j<input; ++j ){ 2 if( input%j==0 ){ 3 flag = 1; 4 break; 5 } 6 }

どんな数も1で割った余りは0なので、かならずこのif() でbreakする。

C

1 if(flag=0){ 2 prime[N_p] = input; 3 ++N_p; 4 }

flag = 0 の評価値は常に 0 だから、この {...} には飛び込まない。

[追記]

15この整数? 9 8 7 6 5 4 3 2 0
素数
合成数
9 8 7 6 5 4 3 2

この結果から推理せよ。素数を素数と判定できていないのだからそこに誤りがある。

投稿2018/07/21 02:10

編集2018/07/21 03:38
episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pepperleaf

2018/07/21 02:12

> どんな数も1で割った余りは0なので 素数判定で、1で割ってはいけないですね。
to-fu

2018/07/21 04:41

その通りでした。ありがとうございます。 しかし、j=2 としても結果は同じように出てきました。どこに誤りがありそうでしょうか。 あと、結果からしてバブルソート(?)ができていないと思うのですが、どうでしょう。 質問本文にも書き加えるべきですね。すみません。
episteme

2018/07/21 05:11 編集

× if(flag=0){ バブルソート(?)ができていない → for-loop に誤り # 現象を観察し、そして推理せよ # 必要に応じデバッガを使うあるいは要所要所にprintfを挿入することで途中経過を観察し以下同文
to-fu

2018/07/21 07:12

できました。 イコールが二つ必要だったことを失念してました。そこだけ直したらソートもうまくいきました。(どうしてなんでしょう・・・・) 要所要所のprintfもこれから活用していきたいと思います。 ありがとうございました。
episteme

2018/07/21 07:58

> そこだけ直したらソートもうまくいきました。(どうしてなんでしょう・・・・) そこを直せばソートもうまくいってるように見えるテストケースだから。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問