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

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

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

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

2回答

2017閲覧

素数番目の素数の和を計算するプログラムを作りたい

Syoshinsya_1

総合スコア3

C

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2021/12/07 09:39

編集2021/12/08 03:13

前提・実現したいこと

整数n以下の素数番目の素数の和を求めるプログラムを作成したいです。
k番目の素数pについてkもまた素数であるときにこれを素数番目の素数と呼びます。
具体的にはn=8としたとき、8以下の素数の中で2番目の素数である3,3番目の素数である5の和である8が出力されるというようなプログラムを作成したいです

方針としては3から奇数のみをchecksosuuで調べていき素数番目の素数なら配列に格納し、後でまとめて足すというプログラムにしたいです

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

int型の自作関数checksosuuが動作しません 例えばn=8に設定して実行すると結果が0となりint checksosuuがうまくいってないことが確認できました。 printf("OK");などとして確認したところwhileループはきちんと回数通りに動いているのですがsosuuhantei が動いていません。

該当のソースコード

C

1#include<stdio.h> 2#include<math.h> 3 4#define n 8//何番目まで調べるか 5 6 7int checksosuu(int a){ 8 int i=3; //素数判定 9 10 for(i=3;i<=a;i+=2){ 11 if(a%i==0)return 0; 12 } 13 return 1; 14} 15 16 17int main(void){ 18 int i=3,j,c=0,N=0,sum=0; 19 int p[n]; 20 21 while(n>i){ 22 if(checksosuu(i)==1){ 23 c++; 24 p[N]=i; 25 N++; 26 27 } 28 i+=2; 29 } 30 for(j=0;j<c;j++){ 31 sum=sum+p[j]; 32 } 33 printf("%d",sum); 34 35 return 0; 36} 37 38

試したこと

printf("OK")などです

補足情報(FW/ツールのバージョンなど)

VScode

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

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

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

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

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

1T2R3M4

2021/12/07 09:44

int sosuuhantei がありませんが。
Syoshinsya_1

2021/12/07 09:51

int checksosuuの間違いです 申し訳ないです
jimbe

2021/12/07 18:18

前回のご質問はどうなったのでしょうか。
Syoshinsya_1

2021/12/07 20:05

コードが完ぺきに動くことまでは確認いたしました。 しかし初学者でまだアクセサに関する知識がないためそもそも何をしているのかがあまりわかっていない状態なので、コードのわからない部分やアクセサについてググったりしてどういうものなのかを理解しようとしている最中です。
episteme

2021/12/07 23:00

「n=8としたとき」と「2番目の素数である3,3番目の素数である5の和である8が出力される」との関係がわかりません。「n番目までの素数の和」ではないんですね? ならば何ですか?
Syoshinsya_1

2021/12/08 03:15

書き方悪くてすみません 「整数n以下の素数番目の素数の和」を出力するプログラムを作りたいです
episteme

2021/12/08 03:22 編集

>「整数n以下の素数番目の素数の和」 n=8 ならば n以下の素数は 2, 3, 5 なので 2, 3, 5番目の素数: 3, 5, 11 の和、ですか? それとも 整数n以下の(素数番目の素数)の和 ですか?
Syoshinsya_1

2021/12/08 03:36

整数n以下の(素数番目の素数)です。 何度もすみません
guest

回答2

0

C

1#include<stdio.h> 2#include<math.h> 3 4#define n 15//何番目まで調べるか 5 6 7int checksosuu(int a){ 8 int i=3; //素数判定 9 if(a%2==0)return 0; 10 for(i=3;i<(int)sqrt(a);i+=2){ 11 if(a%i==0)return 0; 12 } 13 14 return 1; 15} 16 17 18int main(void){ 19 int i=3,j,c=1,N=0,sum=3; 20 int p[n]; 21 22 while(n>i){ 23 if(checksosuu(i)==1)c++; 24 if(checksosuu(c)==1){ 25 p[N]=i; 26 N++; 27 28 } 29 i+=2; 30 } 31 for(j=0;j<N;j++){ 32 sum=sum+p[j]; 33 } 34 printf("%d",sum); 35 36 return 0; 37} 38 39

###変更点
変更前のコード

C

1int checksosuu(int a){ 2 int i=3; //素数判定 3 4 for(i=3;i<=a;i+=2){ 5 if(a%i==0)return 0; 6 } 7 return 1; 8} 9

まず関数checksosuuで動かしたときに3が素数ではないと判定されることに気が付いたためsumの初期値を3にすることで和にあらかじめ加えるということにしました。
またchecksosuuは奇数の判定に使うことしか考えていなかったが、偶数の混じってくるカウンターcについても同様に判定しなければいけないと気付いたため偶数を排除する処理を追加。(例えば上記のコードだと4が素数と判定されてしまう)

次にwhileループの中身を見直しました

C

1 while(n>i){ 2 if(checksosuu(i)==1){ 3 c++; 4 p[N]=i; 5 N++; 6 7 } 8 i+=2; 9 }

元のコードだとただ素数の和を求めるプログラムになっていたので素数カウンターcについても素数判定をしてから配列pに加えていくという処理を加えました。できればif文を一つで済ませたかったのですがiを判定した後にc++という作業が必要であると考えたのでif文を二つに分けてます
###謝辞

まず私自身が大意とはだいぶ異なるプログラムをつくってしまい余計な混乱を招いてしまってすみませんでした。また、アドバイスやヒントをくれた皆様。ありがとうございました。
次からはもっと自分で考えてから質問しようと思います。
ありがとうございました

2021/12/9
追記
checksosuuのfor文の条件式をi<aからi<(int)sqrt(a)に変更しました

投稿2021/12/08 03:57

編集2021/12/09 04:04
Syoshinsya_1

総合スコア3

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

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

kazuma-s

2021/12/08 17:37 編集

n が 11 のとき、11以下の素数は、2、3、5、7、11。 1番目の 2 と 4番目の 7 は素数番目の素数ではないからはずすと、 残りの和は 3 + 5 + 11 = 19。 でも、そのコードでは 8 と出ます。
Syoshinsya_1

2021/12/09 04:07

元のプログラムで5を素数判定するときに素数ではないと判定してしまうことが原因でした 素数の性質によりsqrt(a)まで調べたところで打ち切ることによりこのバグを修正しました ご指摘ありがとうございます
guest

0

ベストアンサー

C

1int checksosuu(int a){ 2 int i=3; //素数判定 3 if(a==n+1||a==n) return 0; 4 else{ 5 for(i=3;i<=a;i+=2){ 6 if(a%i==0)return 0; 7 } 8 } 9 return 1; 10}

この中の
if(a==n+1||a==n) return 0;
は何を意図しているのでしょうか?

「a が 3以上a以下の全ての奇数で割り切れない」ことを判定したいなら
その後に続く for-loop だけで十分なのでは?

投稿2021/12/07 10:21

編集2021/12/07 10:37
episteme

総合スコア16614

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

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

Syoshinsya_1

2021/12/07 18:09

その通りです。whileループを判定する関数と混同して入れてしまいました。 その点修正いたしましたが、やはり関数checksosuuが動作しません。 何かダメな点等お気づきになりましたらご教授いただけないでしょうか
episteme

2021/12/07 21:51

for( i=3; i<=a; i+=2) { if(a%i==0)return 0; } これだと iがaに達したとき(i==aのとき)、a%iは0になるので0を返します。 つまりどんな奇数を与えても素数ではないと判定します。
Syoshinsya_1

2021/12/08 03:35

なるほど! そのあたり含めていじっていたら無事動くようになりました。 ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問