我正在尝试解决从数组中提取子序列的算法。它应该显示素数的最长子序列。我已经写了整个算法,但我仍然得到一个无限循环,我不知道在哪里以及为什么。我正在递增两个索引并在最后修改第一个索引,但它仍然无法正常工作。非常感谢!!!
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/