寻找两个数字之间的素数

时间:2012-01-15 06:11:04

标签: c++ primes

附件是查找2个数字之间所有素数的代码。 t是测试用例的数量,nm分别是上限和下限。我运行了这个程序,它一直给我sigsegv错误。

#include <iostream>
using namespace std;
int Prime1(int n,int m)
{
    int i,j;
    //cout<<"Enter :"<<endl;
    //cin>>n;
    int x[n];
    for(i=0;i<=n;i++)
    {
        x[i]=1;
    }
    for(i=4;i<=n;i+=2)
    {
        x[i]=0;
    }
    for(i=3;i<=n;i+=2)
    {
        if(x[i])
        {
            for(j=2*i;j<=n;j+=i)
            {
                x[j]=0;
            }
        }
    }
    if(m==1)
    {
        m=m+1;}
        for(i=m;i<=n;i++)
        {
            if(x[i])
            {
                cout<<i<<endl;;
            }
        }

}
int main()
{
    int x,y,t;
    cin>>t;
    while(t!=0)
    {
        cin>>x>>y;
        cout<<endl;
        if(x>y)
        {
            Prime1(x,y);
        }
        else
        {
            Prime1(y,x);
        }
        t--;
    }
    system("pause");
}

3 个答案:

答案 0 :(得分:5)

看看这些行

  

int x [n];

for(i=0;i<=n;i++)

你的数组大小是n,你正试图从第n + 1个元素中获取值

所以它应该是

  

int x [n];

for(i=0;i<n;i++)

答案 1 :(得分:1)

此处:int x[n];

您为n整数分配内存,该内存上升到索引n-1。但是在for循环中,最多引用索引n,从而导致sigsegv。通常,sigsegv错误是无效内存访问的结果。

例如,如果您的数组大小为3,则只能访问x[0]x[1]x[2]。因此,您必须分配n+1元素或制作循环条件i<n而不是i<=n。这取决于您的应用程序逻辑。

答案 2 :(得分:0)


嗨,这是代码。


#include <iostream>

using namespace std;
void prime_num(int startNbr, int endNbr){

bool isPrime=true;

for ( int i = startNbr; i <= endNbr; i++) {

for ( int j = 2; j <= endNbr; j++){
if ( i!=j && i % j == 0 ){

isPrime=false;
break;
}
}

if (isPrime)
cout << i << endl;

isPrime=true;
}
}

int main(){
int startNbr, endNbr;

cout << " Enter start of the scale: ";
cin >> startNbr;

cout << " Enter end of the scale: ";
cin >> endNbr;

prime_num(startNbr, endNbr);

return 0;

}