Cでエラトステネスの篩を実装しようとしています。このコードは小さな入力値に対して機能しますが、入力が特定の範囲を超えると、ランタイムエラースローされます。これは、SPOJベースの古典的なセクションの2番目の問題です。間違いは何ですか?入力値が100000より大きい場合、ランタイムエラーが発生する
#include<stdio.h>
#include<math.h>
int prime(unsigned long int, unsigned long int);
int main()
{
int nitem;
unsigned long int sn,fn;
scanf("%d", &nitem);
while(nitem)
{
scanf("%lu", &fn);
//printf("%d",fn);
scanf("%lu", &sn);
prime(fn, sn);
nitem--;
}
return 0;
}
int prime(unsigned long int fn, unsigned long int sn)
{
unsigned long int prim[100000];
int i,j,k;
for(i = 0; i < 100000; i++)
{
prim[i] = 1;
}
prim[0] = 0;
prim[1] = 0;
//printf("%d", sn);
//printf("%d", k);
//printf("%d", (k <= sn));
for(k = 2; k <= sqrt(sn); k++)
{
// printf("alksnc%5d", k);
if(prim[k] == 1)
{
for(j = 2; (k * j) <= sn; j++)
{
//printf("%d", prim[k]);
prim[k * j] = 0;
}
}
}
for(int i = 0; i <= sn; i++)
{
if(prim[i] !=0 && i >= fn)
{
printf("%lu\n", i);
}
}
printf("\n");
return;
}
入力:
1
100000 100345
出力:
run time error
入力:
1
3 5
出力:
3
5
[タグ:java]と[タグ:C++]はなぜですか? –
迷惑メールにタグを付けないでください。これはCプログラムです。それはC++ではなく、Javaではありません。今回はMikeCATがあなたのために修正しましたが、将来的には覚えておいてください。 –
配列の範囲外にアクセスしないでください。そうしないと、*未定義の動作*が呼び出されます。 – MikeCAT