c语言编程:从素数中找连续和不连续的最长的等差数列。怎么办?

如题所述

第1个回答  2019-11-30
"#include<iostream>
#include<iomanip>
using
namespace
std;
class
Series
//定义1个序列类来存放连续的等差序列的元素和长度
{
public:
Series(int
n)
//含有形参的构造函数
{
length=n;
a=new
int[n];
}
Series(){}
//不含有形参的构造函数
int
getlength()
//获得序列长度的函数
{
return
length;
}
void
assign(int
i,int
j)
//为序列中的每一个元素赋值的函数
{
a[i]=j;
}
void
print()
//打印序列中的每一个元素的函数
{
for(int
i=0;i<length;i++)
cout<<setw(5)<<a[i];
}
void
set(int
n)
//为对象重置值的函数
{
length=n;
a=new
int[n];
}
private:
int
length;
int
*a;
};
void
main()
{
int
i,n,d=1,j=0,k=0,m=0,storage,countPnum=0,countSeries=0,length=1;
int
b[9999];
//用数组b来存放~10000的全部整数
for(i=0;i<9999;i++)
b[i]=i+2;
for(n=2;n<5001;n++)
//用筛选法得到全部素数
{
for(i=n+1;i<10001;i++)
if(i%n==0)
b[i-2]=0;
}
for(i=0;i<9999;i++)
{
if(b[i]!=0)
countPnum++;
}
int
*a=new
int[countPnum];
//用数组a来存放全部的素数
for(i=0;i<9999;i++)
{
if(b[i]!=0)
{
a[k]=b[i];
k++;
}
}
/*求此序列中连续的最长的等差序列*/
for(i=0;i<countPnum;i++)
//计算素数序列中连续的等差序列的个数countSeries
{
if((a[i+1]-a[i])==(a[i+2]-a[i+1]))
countSeries++;
}
int
*d1=new
int[countSeries];
//用数组d来存放每一个等差序列的长度
for(i=0;i<countPnum;i++)
//计算每一个等差序列的长度
{
storage=i;
if((a[i+1]-a[i])==(a[i+2]-a[i+1]))
{
d1[j]=2;
while((a[i+1]-a[i])==(a[i+2]-a[i+1]))
{
i++;
if((i+2)>countPnum-1)
break;
d1[j]++;
}
j++;
}
i=storage;
}
Series
*c1=new
Series[countSeries];
//用Series类数组来存放全部的等差序列及其长度
for(i=0,j=0;i<countSeries;i++,j++)
c1[i].set(d1[j]);
j=0;
for(i=0;i<countPnum;i++)
{
storage=i;
if((a[i+1]-a[i])==(a[i+2]-a[i+1]))
{
c1[m].assign(j++,a[i]);c1[m].assign(j++,a[i+1]);
while((a[i+1]-a[i])==(a[i+2]-a[i+1]))
{
c1[m].assign(j++,a[i+2]);
i++;
if((i+2)>countPnum-1)
break;
}
m++;
}
i=storage;
j=0;
}
m=0;
for(i=0;i<countSeries;i++)
//找到最长的等差序列的长度
{
if(m<c1[i].getlength())
m=c1[i].getlength();
}
cout<<"此序列中连续的最长的等差序列是:"<<endl;
for(i=0;i<countSeries;i++)
//打印长度最长的等差序列
{
if(c1[i].getlength()==m)
{
c1[i].print();
cout<<endl;
}
}
/*求此序列中不连续的最长的等差数列*/
for(d=2;d<4999;d++)
//令公差d从到进行循环
{
for(i=0;i<countPnum;i++)
//扫描素数序列中的全部数,找到符合公差大小的等差数列
{
if(a[i]+d*k-2>9998)
//防止下标越界
break;
else
{
while(b[a[i]+d*k-2])
//假如是素数,就继续进行扫描过程
{
length++;
k++;
if(a[i]+d*k-2>9998)
//防止下标越界
break;
}
if(m<length)
//m用来存放最长的等差序列的长度
m=length;
k=1;
length=1;
}
}
}
cout<<"此序列中不连续的最长的等差数列是:"<<endl;
for(d=2;d<4999;d++)
//在进行一次上述的过程,当等差序列的长度为最大长度时,把它打印出来
{
for(i=0;i<countPnum;i++)
{
if(a[i]+d*k-2>9998)
break;
else
{
while(b[a[i]+d*k-2])
{
length++;
k++;
if(a[i]+d*k-2>9998)
break;
}
if(length==m)
{
for(j=0;j<m;j++)
//打印
cout<<setw(5)<<(a[i]+j*d);
cout<<endl;
}
length=1;
k=1;
}
}
}
}"
相似回答