从数组中提取子序列

Extracting a subsequence from an array

本文关键字:提取 数组      更新时间:2023-10-16

我正试图解决一个从数组中提取子序列的算法。它应该显示素数的最长子序列。我已经写了整个算法,但我仍然有一个无限循环,我不知道在哪里以及为什么。我正在增加这两个索引,并在最后修改第一个索引,但它仍然不起作用。非常感谢!!!

p.S:citire读取数组,prim检测数字是素数还是组合数,afiare显示子序列,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

可能只是该代码的众多问题之一:

    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开始。

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

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

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