从数组中提取子序列

时间:2015-02-23 18:55:53

标签: c++ algorithm

我正在尝试解决从数组中提取子序列的算法。它应该显示素数的最长子序列。我已经写了整个算法,但我仍然得到一个无限循环,我无法弄清楚在哪里和为什么。我正在递增两个索引并在最后修改第一个索引,但它仍然无效。非常感谢!!!

P.S:citire读取数组,prim检测数字是否为素数或组成,afisare显示子序列,detSecv确定最长的子序列。

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

输入数据:

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

3 个答案:

答案 0 :(得分: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++;

这里有两个潜在的无限循环。如果while中的条件在第一次迭代时没有返回true,i(或j)将永远不会递增,并且您将拥有无限循环。你应该几乎总是在任何条件之外增加这些变量。

答案 1 :(得分:0)

稍微改变代码,你可以使它工作,有一件事,你不需要用索引1启动数组。你总是可以从索引零开始。

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

在打印时尝试检查没有找到素数子序列的情况。

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

答案 2 :(得分:0)

这是验证数字是否为素数的更好方法

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

你可以为你的数组中的每个数字应用该函数,如果它是素数,你可以将它添加到一个新的数组中:

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