Нахождение простых чисел между двумя числами - PullRequest
1 голос
/ 15 января 2012

Прикреплен код для поиска всех простых чисел между 2 числами. t - количество тестовых случаев, а n, m - верхний и нижний пределы соответственно. Я запустил эту программу, и она продолжает выдавать ошибку 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 ]

5 голосов
/ 15 января 2012

Посмотрите на эти строки

int x [n];

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

ваш размер массива равен n, и вы пытаетесь получить значение из n+ 1-й элемент

Так должно быть

int x [n];

for(i=0;i<n;i++)
1 голос
/ 15 января 2012

Здесь: int x[n];

Вы выделяете память для n дюймов, что соответствует индексу n-1.Однако в ваших циклах for вы ссылаетесь на индекс n и, таким образом, вызываете sigsegv.Как правило, ошибки sigsegv являются результатом неправильного доступа к памяти.

Например, если ваш массив имеет размер 3, вы можете обращаться только к x[0], x[1] и x[2].Таким образом, вы должны либо выделить n+1 элементов, либо сделать условия цикла i<n вместо i<=n.Это будет зависеть от логики вашего приложения.

0 голосов
/ 15 января 2012

Привет, вот код.


#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;

}
...