c++ - 从数组中提取子序列

标签 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

最佳答案

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

    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)将永远不会递增,您将进入无限循环。您几乎应该总是在任何条件之外递增此类变量。

关于c++ - 从数组中提取子序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28681240/

相关文章:

c++ - 如何编译具有动态并行性的 .cu?

c++ - std::async,std::promise 和 std::packaged_task 会阻塞主线程,它们是什么意思?

c++ - 在函数模板中使用静态局部变量的地址作为类型标识符是否安全?

algorithm - 创建数独谜题时出现重复问题

c++ - 在 C++ 中嵌套 for()

c++ - 关于默认可构造性的差异

java - 像链一样左移数组

swift - Poisson Disk Generator 排除了四个 View 象限中的三个

c - C中的拉格朗日插值算法在许多步骤后发散

c++ - 为什么不是条件 *First1 == * First2 ?? (C++ STL包含函数实现)