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