主要思路就是先筛出素数出来,再通过在素数容器每次找两个数得到的公差来找出这个等差数列
但是运行结果好像不尽人意。。。。。。。。。。。。。。。。。
从昨天一直到现在都在搞这东西,实在没有办法了就来贴吧 求各位老哥指点下
#include<iostream>
#include<vector>
using namespace std;
typedef vector<int> ivec;
//递归
bool zhaosushu(ivec v,int d,int c,ivec::iterator pos)
{
if(c==10)//找到10个数,返回true后输出
return true;
else if(*(++pos)==(*pos) + d)
{ //判断条件为 下一个数 = 上一个 + 公差
++pos;//迭代器 下移 一位 ,用于在下一递归
++c;// 计数+1
return zhaosushu(v,d,c,pos);
}
else if(*(++pos) != (*pos) + d)
return false;//不符合等差数列条件,返回false ,继续找数列下一轮的第一、二个数
}
int main()
{
int e=1;//用于控制while循环
ivec v1;
ivec v;
while(e)
{
for(int i=0;i<=500;++i)//在向量容器中插入500个 1,因为下标从0开始,所以要用<=号,插入多一个 1
{//此部分用于在一次500以内的素数中若找不到,再在容器中插入500个1
v.push_back(1);
}
int k=v.size();
// 埃拉托斯特尼筛法 筛选素数
for(int i=2;i<=k;++i)
{
if(v[i])
{
for(int j=2*i;j<k;j+=i)
{
v[j]=0;//下标为合数的数 赋值为 0;
}
v1.insert(v1.end(),i);/*把素数放入到另一个向量容器中,其实这里有个错误,每执行一次while循环,
都会插入上一次while循环的质数,原想改,但是这个while循环好像只执行了一次
就没有结果了
*/
}
}
for(ivec::iterator pos=v1.begin();pos!=v1.end();++pos)//等差数列的第一个 数的位置
{
++pos;
for(ivec::iterator pos1=pos;pos1!=v1.end();++pos1)// 等差数列的第二个 数的位置
{
int d=(*pos1)-(*pos);//等差数列的公差
int c=2;//计数数列中的数目,因由第一个和第二个得到公差,接下来找剩余的8个数,所以c=2;
if(zhaosushu(v1,d,c,pos1))// 参数1 为装有全是素数的容器
{// 参数4 为等差数列的第二个数的迭代器
cout<<d<<endl;//输出公差
cout<<*pos<<" "<<*pos1<<endl;//输出等差数列的前两个数
e=0;//用于跳出while循环
}
}
}
}
return 0;
}
运行结果

但是运行结果好像不尽人意。。。。。。。。。。。。。。。。。
从昨天一直到现在都在搞这东西,实在没有办法了就来贴吧 求各位老哥指点下
#include<iostream>
#include<vector>
using namespace std;
typedef vector<int> ivec;
//递归
bool zhaosushu(ivec v,int d,int c,ivec::iterator pos)
{
if(c==10)//找到10个数,返回true后输出
return true;
else if(*(++pos)==(*pos) + d)
{ //判断条件为 下一个数 = 上一个 + 公差
++pos;//迭代器 下移 一位 ,用于在下一递归
++c;// 计数+1
return zhaosushu(v,d,c,pos);
}
else if(*(++pos) != (*pos) + d)
return false;//不符合等差数列条件,返回false ,继续找数列下一轮的第一、二个数
}
int main()
{
int e=1;//用于控制while循环
ivec v1;
ivec v;
while(e)
{
for(int i=0;i<=500;++i)//在向量容器中插入500个 1,因为下标从0开始,所以要用<=号,插入多一个 1
{//此部分用于在一次500以内的素数中若找不到,再在容器中插入500个1
v.push_back(1);
}
int k=v.size();
// 埃拉托斯特尼筛法 筛选素数
for(int i=2;i<=k;++i)
{
if(v[i])
{
for(int j=2*i;j<k;j+=i)
{
v[j]=0;//下标为合数的数 赋值为 0;
}
v1.insert(v1.end(),i);/*把素数放入到另一个向量容器中,其实这里有个错误,每执行一次while循环,
都会插入上一次while循环的质数,原想改,但是这个while循环好像只执行了一次
就没有结果了
*/
}
}
for(ivec::iterator pos=v1.begin();pos!=v1.end();++pos)//等差数列的第一个 数的位置
{
++pos;
for(ivec::iterator pos1=pos;pos1!=v1.end();++pos1)// 等差数列的第二个 数的位置
{
int d=(*pos1)-(*pos);//等差数列的公差
int c=2;//计数数列中的数目,因由第一个和第二个得到公差,接下来找剩余的8个数,所以c=2;
if(zhaosushu(v1,d,c,pos1))// 参数1 为装有全是素数的容器
{// 参数4 为等差数列的第二个数的迭代器
cout<<d<<endl;//输出公差
cout<<*pos<<" "<<*pos1<<endl;//输出等差数列的前两个数
e=0;//用于跳出while循环
}
}
}
}
return 0;
}
运行结果



