等差素数列

来源:互联网 发布:金融数据库软件 编辑:程序博客网 时间:2024/06/01 10:51

小于10的素数中有3、5、7组成等差数列,在30以内的素数中,有5、11、17、23、29组成等差数列;

在指定区间[x,y]如果存在成等差数列的n(n>=3)个素数,试求n的最大值,并输出一个最多项数的等差素数列;

1.设计要点:

(1)、标注素数;

通过m循环枚举指定区间[x,y]内的奇数,应用试商法探求素数,设置a数组并通过a[m]=1标注奇数m为素数;

(2)、扫描等差数列;

设置d循环(2~(y-x)/2,递增2)枚举公差d,k循环(x~y-2*d)枚举首项k;通过这二重循环扫描首项为k,公差为d的等差数列;

(3)、探求等差素数列的项数;

设置j是首项为k,公差为d的等差数列的项,通过条件为“a[j]==1”的条件循环探求等差素数列的项数s;

(4)、比较求取项数最大值;

项数s与max比较求得等差素数列的项数最大值max,并记录首项k1与公差d1;
最后输出项数最大值max,输出最大项数等差素数列k1+j*d1(j=0,1,……,max-1);

2.等差素数列程序设计:

#include<stdio.h>#include<math.h>int main(){   int d,d1,j,k,k1,m,s,t,x,y,max,a[5000];   printf("请输入区间下,上限x,y(y<10000):");   scanf("%d,%d",&x,&y);   if(x%2==0)      x++;   for(m=x;m<=y;m=m+2)            /*枚举区间内的奇数*/   {      for(t=0,j=3;j<=sqrt(m);j+=2)         if(m%j==0)         {            t=1;            break;         }      if(t==0)         a[m]=1;                  /*标注奇数m为素数*/   }   max=0;   for(d=2;d<=(y-x)/2;d+=2)      for(k=x;k<=y-2*d;k=k+2)     /*枚举首项k及公差d*/      {         if(a[k]!=1)            continue;         j=k;         s=0;         while(a[j]==1)           /*探求等差素数列项数s*/         {            j+=d;            s++;         }         if(s>max)                /*比较等max最大值并记录*/         {            max=s;            k1=k;            d1=d;         }      }   if(max>2)   {      printf("区间[%d,%d]内等差素数列最多有%d项:\n",x,y,max);      for(j=0;j<=max-1;j++)         printf(" %d",k1+j*d1);    /*输出项数最多的等差素数列*/      printf("\n");   }   else      printf("区间[%d,%d]内没有找到等差素数列!\n",x,y);}

3.程序运行示例:

请输入区间下,上限x,y(y<10000):100,3000区间[101,3000]内等差素数列最多有10项:199 409 619 829 1039 1249 1459 1669 1879 2089

4.改进搜索等差素数列:

(1)、改进要点;

当所有区间中的整数比较大时,以区间中的整数位数组下标可能超出下标限制,为减轻a数组下标太大的压力,求出区间[x,y]中的奇数个数n+1,a数组只标注这些奇数的序号:

  • 若a[k]=1,即区间中的第k(k=0,1,……,n)个奇数为素数

同时,为扩大搜索范围,相关变量设置为长整型;

设置d,k二重循环扫描等差数列与上面相同,但探求等差数列的项数有变化:

j=k;c=d/2;s=0;          /*引进变量c,以便与a数组相匹配*/while(a[j]==1){   j=j+c;   s++;}

(2)、程序设计:

#include<stdio.h>#include<math.h>int main(){   long j,k,k1,m,n,x,y,a[30000];   int c,d,d1,s,t,max;   printf("请输入区间下,上限x,y(y<=30000):");   scanf("%ld,%ld",&x,&y);   if(x%2==0)      x++;   n=(y-x)/2;                /*区间共n+1个奇数*/   for(k=0;k<=n;k++)   {      m=x+2*k;      for(t=0,j=3;j<=sqrt(m);j+=2)         if(m%j==0)         {            t=1;            break;         }      if(t==0)         a[k]=1;             /*第k(0,1,...,n)个奇数m为素数*/   }   max=0;   for(d=2;d<=(y-x)/2;d+=2)      for(k=0;k<=n-2;k++)      {         if(a[k]!=1)            continue;         j=k;         c=d/2;         s=0;         while(a[j]!=1)         {            j=j+c;            s++;         }         if(s>max)            /*比较得max最大值并记录*/         {            max=s;            k1=k;            d1=d;         }      }   if(max>2)   {      printf("区间[%ld,%ld]内等差素数列最多有%d项: \n",x,y,max);      for(j=0;j<=max-1;j++);         printf(" %ld",x+k*2+j*d1);      printf("\n");   }   else      printf("区间[%ld,%ld]内没有找到等差素数列!  \n",x,y);}

(3)、程序运行示例:

请输入区间下,上限x,y(y<=30000):10000,30000区间[10001,30000]内等差素数列最多有9项:10859 11069 11279 11489 11699 11909 12119 12329 12539
1 0