从数组中提取子序列
Extracting a subsequence from an array
我正试图解决一个从数组中提取子序列的算法。它应该显示素数的最长子序列。我已经写了整个算法,但我仍然有一个无限循环,我不知道在哪里以及为什么。我正在增加这两个索引,并在最后修改第一个索引,但它仍然不起作用。非常感谢!!!
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;
}
}
相关文章:
- 从指向结构数组的指针中提取元素
- 在C++如何从数组中提取成员并返回成员类型的数组?
- 如何从字符数组C++中提取2个整数并将它们存储在2个变量中(初学者)
- C 仅使用指针从多维数组中提取特定列
- 将文本文件数据读入字符数组时提取运算符的歧义
- 如何在 c++ 中提取 2D 数组的列?
- 从数组中提取一对数字
- 从自定义结构数组中提取数据
- 需要根据读取的数据类型将ifstream提取到单独的数组中
- 将 __m128i?布尔数组中每个布尔字节的低位提取到打包的位图
- 无法从结构数组 C++ 中提取数据
- 如何从对象数组中提取属性数组?
- 将字符数组的一部分提取为 char*
- 使用C 从定界线拆分字符串中提取整数数组
- 如何将提取的字符串数据转换为字符数组
- QRegExp提取数组名称和索引
- 从二进制文件中提取数组数据的正确方法
- 如何从结构数组中提取数组
- 在编译时使用 C++ 从另一个数组中提取数组
- 是否可以从模板参数中提取数组大小