简体   繁体   中英

Extracting a subsequence from an array

I'm trying to solve an algorithm for extracting a subsequence from an array. It should display the longest subsequence of prime numbers. I have written the whole algorithm but I still get an infinite cycle and I can't figure out where and why. I'm incrementing both indices and modifying the first index at the end, but it is still not working. Thanks a lot !!!

PS: citire reads the array, prim detects if a number is prime or composed, afisare displays the subsequence and detSecv determines the longest subsequence.

#include <iostream>
#include <math.h>

using namespace std;

void citireSecv(int &n,int x[50])
{
    cout<<"Da n: ";
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cout<<"Da un nr: ";
        cin>>x[i];
    }
}

int prim(int n)
{
    int d=2;
    while(d<=sqrt(n) && n%d!=0)
    {
        if(d==2)
            d=3;
        else
            d=d+2;
    }
    if(d>sqrt(n)) return 1;
    else          return 0;
}

void afisare(int n,int x[50],int st,int f)
{
    for(int i=st;i<=f;i++)
        cout<<x[i]<<" ";
}

void detSecv(int n,int x[100],int &st,int &f)
{
    st=1; f=0;
    int i=1,j;
    while(i<=n-1)
    {
        while(i<=n-1)
        {
            if(prim(x[i])==0 && prim(x[i+1])==0) i++;
        }
        j=i+1;
        while(j<=n-1)
            if(prim(x[j])==0 && prim(x[j+1])==0) j++;
        if((j-i) > (f-st))
        {
            st=i;
            f=j;
        }
        i=j+1;
    }

}



int main()
{
    int n,x[100],st,f;
    citireSecv(n,x);
    detSecv(n,x,st,f);
    afisare(n,x,st,f);
    return 0;
}

Input data:

n=2
First number is: 5
Second number is: 7

Probably just one of many issues with that code:

    while(i<=n-1)
    {
        if(prim(x[i])==0 && prim(x[i+1])==0) i++;
    }
    j=i+1;
    while(j<=n-1)
        if(prim(x[j])==0 && prim(x[j+1])==0) j++;

There are two potential infinite loops here. If the conditions in the while don't return true on the first iteration, i (or j ) will never get incremented, and you will have your infinite loop. You should almost always increment such variables outside of any conditions.

With a slight change in your code, you make it work, and one thing, you don't need to start array with index 1. you can always start with index zero.

for(int i=1;i<=n;i++)
{
    cout<<"Da un nr: ";
    cin>>x[i];
}

try to check for a case when no prime subsequence is found, while printing.

void detSecv(int n, int *x, int &start, int &end)
{
    start = -1;
    end = -1;
    int i=0,j;
    while(i < n) {
        if(prim(x[i])) {
            j = i + 1;
            while(j < n)
                if(prim(x[j])) j++;
                else break;
        } else {
            i++;
            continue;
        }
        if((j-i) > (end - start)) {
            start = i;
            end = j-1;
        }
        i=j+1;
    }
}

This is a better way to verify if a number is prime or not

bool IsPrime(int number) {
int primeStep = 2;
double stepLimit = sqrt(number);
while(primeStep <= stepLimit)
{
    if(number % primeStep == 0)
        return false;
    primeStep += 1;
}
return true;
}

And nou you can apply that function for each number in your array, and if it's prime , you add it in a new array like this:

void detSecv(int numberOfItems,int *arrayOfNumbers)
{
   int arrayOfPrimeNumbers[50] = {};
   int index = 0;

 for(int i = 0; i < numberOfItems; i++)
 {
    if(IsPrime(arrayOfNumbers[i])){
        arrayOfPrimeNumbers[index] = arrayOfNumbers[i];
            index += 1;
    }
}

int secondIndex = 0;
while(arrayOfPrimeNumbers[secondIndex] != 0)
{
    cout << arrayOfPrimeNumbers[secondIndex] << " ";
    secondIndex += 1;
}
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM