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

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

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

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

Q&A

3回答

727閲覧

c言語 素数を表示するとともにカウントするプログラム

citrus-27

総合スコア0

C

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

0グッド

0クリップ

投稿2021/01/11 15:59

前提・実現したいこと

素数に2が入ったとき表示するようにしたい

発生している問題・エラーメッセージ

2が表示されない

エラーメッセージ 特になし 該当のソースコード #include<stdio.h> int prime(int x,int y); int main(void) { int a, b; int num; printf("指定された範囲の素数の数を求めます。\n"); do{ printf("範囲の下限となる正の整数を入力してください。\n"); scanf("%d", &a); } while(a<=0); do{ printf("範囲の上限となる正の整数を入力してください。\n"); scanf("%d", &b); }while(a>b); printf("調査を開始します。\n"); num = prime(a, b); printf("求めた素数の個数は%d個です。\n", num); return 0; } int prime(int x,int y) { int num,i,j,k; if(x <= 2 ){ num = 1; } else { num = 0; } for(i=x;i<=y;i++){ k = 0; for(j=2;j<i;j++){ if(i%j == 0){ k = 0; break; } else { k = 1; } } if(k){ printf("%d\n",i); num++; } } return num; } ```ここに言語名を入力 c ### 試したこと 1から10の範囲を指定したとき3、5、7は表示され、カウントは4と正しい結果が出た。 ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答3

0

変数 k を使う代わりに、i と j の値で判断したらいいのではありませんか?
x <= 2 を特別扱いしなくていいし。

C

1int prime(int x, int y) 2{ 3 int num = 0, i, j; 4 5 for (i = x; i <= y; i++) { 6 for (j = 2; j < i; j++) 7 if (i % j == 0) break; 8 if (j == i) { 9 printf("%d\n", i); 10 num++; 11 } 12 } 13 return num; 14}

投稿2021/01/11 17:41

kazuma-s

総合スコア8224

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

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

0

質問文のコードでは、下限が2以下のときにnumに1を代入しているので、合計数は(上限が2以上であれば)正しい値が表示される。なお、下限・上限ともに1を設定すると、本来の合計数は0個のはずが1個と表示されるので、このコードには問題がある。

その後の処理で、iが2のときには内側のfor文が(j < iが成立せずに)スキップされるため、printfで2が表示されることはない。

整理したコードがこちら。

C

1int prime(int x, int y) 2{ 3 int num = 0; 4 if (x < 2) { 5 x = 2; 6 } 7 for (int i = x; i <= y; i++) { 8 int is_prime = 1; 9 10 for (int j = 2; j <= i / 2; j++) { 11 if (i % j == 0) { 12 is_prime = 0; 13 break; 14 } 15 } 16 if (is_prime) { 17 printf("%d\n",i); 18 num++; 19 } 20 } 21 return num; 22}

投稿2021/01/11 17:24

Daregada

総合スコア11990

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

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

0

C

1 2// nが素数なら非0を返す 3int is_prime(int n) { 4 // あなたが書く部分 5} 6 7 8// x以上 y以下の素数の個数を返す 9int prime(int x,int y) { 10 int num = 0; 11 int n; 12 13 for ( n=x; n<=y; n++ ) { 14 if ( is_prime(n) ) { // nが素数なら 15 printf("%d\n",n); // 表示して 16 num++; // 個数に+1 17 } 18 } 19 return num; 20}

って書けば望みの動作が得られます。
素数判定と個数の勘定を一度にやるより簡単だし明確です。

※ 一度にやりたいなら、is_prime を prime の中に書き下せばいい。

C

1// x以上 y以下の素数の個数を返す 2int prime(int x,int y) { 3 int num = 0; 4 int n; 5 int is_prime; 6 7 for ( n=x; n<=y; n++ ) { 8 /* ----- 9 あなたが書く部分: 10 n が素数なら 非0、さもなくば 0 を is_prime にセットする 11 */ 12 if ( is_prime ) { // nが素数なら 13 printf("%d\n",n); // 表示して 14 num++; // 個数に+1 15 } 16 } 17 return num; 18}

投稿2021/01/11 17:15

編集2021/01/11 17:22
episteme

総合スコア16614

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問