【发布时间】:2016-10-20 07:24:43
【问题描述】:
我正在尝试在 C 中实现 Eratosthenes 筛选。该代码适用于小的输入值,但是一旦输入超出特定范围,就会引发运行时错误。这是 SPOJ 基础经典部分的第二个问题。什么错误?
#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
【问题讨论】:
-
请不要标记垃圾邮件。这是一个 C 程序。它不是 C++,也不是 Java。 MikeCAT 这次为您修复它,但请记住以备不时之需。
-
不要访问超出范围的数组,否则会调用未定义的行为。
-
您的标题严重误导。您的崩溃示例输入是
100000,而不是10000。 -
您将
100345传递给数组大小仅为100000并使用prim[k * j] = 0;进行索引的函数。您的迭代限制是(k * j) <= sn但sn >= 100000。根据需求为数组分配内存。
标签: c