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

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

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

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

Q&A

解決済

3回答

271閲覧

c言語 ある値を境に強制終了してしまう

lkjhgfds

総合スコア7

C

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

0グッド

0クリップ

投稿2018/05/26 13:59

c言語で入力されたnに対して、n<p<=2nを満たす素数pの個数を判定するプログラムなのですが、nが23200を超えたあたりでプログラムが強制終了してしまいます。いったいなぜのでしょうか?
できれば、どこをどう直したらよいのか教えていただけるとありがたいです。ちなみに素数判定はエラトステネスのふるいの考え方を用いています。

また、実行時間が長くなりすぎるということでもなさそうです。

#include <stdio.h>

int main(void){
int a[250000],i,j,n,count=0;
while(scanf("%d",&n)==1){
for(i=2;i<=2n;i++){
a[i] = 1;
}
for(i=2;i<=2
n;i++){
if(a[i]==0) continue;
else{
for(j=i;ij<=2n;j++){
a[ij] = 0;
}
}
}
for(i=n+1;i<=2
n;i++){
if(a[i]==1) count++;
}
printf("%d\n",count);
count = 0;
}
return 0;
}

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

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

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

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

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

guest

回答3

0

ベストアンサー

こんにちは。

意外にハードな落とし穴でした。

for(j=i;ij<=2n;j++){

i*j<=2*nなので、i*j2*nを超えない筈なのですが、
iが46341以上になるとjも同様です。46341*46341=0x80001219ですので、通常の処理系のintの表現範囲を超えてしまうため、おかしなことになります。このような場合、負の値になる処理系が多いです。結果、i*j<=2*nの条件を満たしてしまい、かつ、a[負の値]のメモリをアクセスするため、結果として落ちているようです。

オーバーフロー怖いです。

投稿2018/05/26 14:38

Chironian

総合スコア23272

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

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

lkjhgfds

2018/05/26 14:59

分かりやすい説明ありがとうございます! オーバーフローで逆に条件を通るということは全く思いつきませんでした、、、 この解答をもとにコードを書き変えてみます。
guest

0

たぶん、これが原因ということはないでしょうけど、
ちとまずいところを指摘しておきます

int main(void){
int a[250000],i,j,n,count=0;

AUTO変数でintの250000の配列を確保するというのが無茶です
単純計算でも1MByte以上のスタック領域が必要となります
まあ、イマドキのPC上で1MByte ってのはミミクソ程度の容量でしかないでしょうけど、普通はスタック領域はそこまで確保してません。まー、リンク時のオプションをいじるなりすれば通るでしょうけどね。
いちど、

int a[250000];

int main(void){
int i,j,n,count=0;
...

と、配列宣言を外に出してやってみてください。

投稿2018/05/26 23:39

編集2018/05/26 23:40
y_waiwai

総合スコア87749

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

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

0

配列長が25万なのでこれ以上の添え字でアクセスしようとしているのだと思います(未検証)

投稿2018/05/26 14:13

HogeAnimalLover

総合スコア4830

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問