新手求教。打素数表遇到个诡异的有关问题。
新手求教。。打素数表遇到个诡异的问题。。。
有一段是这样的
for(i=2;i<MAX;i++)
for(j=2;j*i<MAX;j++)//j=i???
prime[j*i]=0;
我以为,把第二行的j=2,改成j=i会提高效率,结果运行时却提示“该内存不能为"written"”
百思不解。。。求高手解释下原因,感激不尽~~~
附下我的完整代码:
#include<cstdio>
#include<cstdlib>
#define MAX 100000
using namespace std;
int main()
{
long a,d,n,i,j;
bool *flag=(bool *)malloc(MAX*sizeof(bool));
flag[1]=0;
for(i=2;i<MAX;i++)
flag[i]=1;
for(i=2;i<MAX;i++){
for(j=2;j*i<MAX;j++){
flag[j*i]=0;
}
}
while(scanf("%ld%ld%ld",&a,&d,&n)!=EOF){
if(a==0&&d==0) break;
while(n){
if(flag[a]==1)
n--;
a+=d;
}
printf("%ld\n",a-d);
}
free(flag);
return 0;
}
------解决方案--------------------
我以为,把第二行的j=2,改成j=i会提高效率,结果运行时却提示“该内存不能为"written"”
i == j时,,当 i很大时,== 10000吧 j*i的值 很很大,那么 prime[10000 * 10000] = 0; 果断越界
越界会发生什么,不可知
------解决方案--------------------
flag只分配了MAX的内存,你却要读MAX*MAX范围的数据
------解决方案--------------------
是哪行报的异常?
有一段是这样的
for(i=2;i<MAX;i++)
for(j=2;j*i<MAX;j++)//j=i???
prime[j*i]=0;
我以为,把第二行的j=2,改成j=i会提高效率,结果运行时却提示“该内存不能为"written"”
百思不解。。。求高手解释下原因,感激不尽~~~
附下我的完整代码:
#include<cstdio>
#include<cstdlib>
#define MAX 100000
using namespace std;
int main()
{
long a,d,n,i,j;
bool *flag=(bool *)malloc(MAX*sizeof(bool));
flag[1]=0;
for(i=2;i<MAX;i++)
flag[i]=1;
for(i=2;i<MAX;i++){
for(j=2;j*i<MAX;j++){
flag[j*i]=0;
}
}
while(scanf("%ld%ld%ld",&a,&d,&n)!=EOF){
if(a==0&&d==0) break;
while(n){
if(flag[a]==1)
n--;
a+=d;
}
printf("%ld\n",a-d);
}
free(flag);
return 0;
}
算法
素数
------解决方案--------------------
我以为,把第二行的j=2,改成j=i会提高效率,结果运行时却提示“该内存不能为"written"”
i == j时,,当 i很大时,== 10000吧 j*i的值 很很大,那么 prime[10000 * 10000] = 0; 果断越界
越界会发生什么,不可知
------解决方案--------------------
flag只分配了MAX的内存,你却要读MAX*MAX范围的数据
------解决方案--------------------
是哪行报的异常?