等差素数列
来源:互联网 发布:金融数据库软件 编辑:程序博客网 时间: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
- 等差素数列
- 等差素数列
- 等差素数列
- 等差素数列
- 2017蓝桥杯:等差素数列
- 第八届蓝桥杯真题 02 等差素数列
- 第八届蓝桥杯【省赛试题2】等差素数列
- [蓝桥杯B组C++/C]第二题:等差素数列
- 等差素数数列
- 趣味素数-等差素数数列-java
- 数论寻找等差素数UVA 10650
- 关于最长等差子列的问题
- 素数筛法系列
- 素数筛法系列之4 预先删除小素数
- excel 等差数
- 最长等差子序列
- "等差三元组"
- codevs1283等差子序列
- 第一个QT应用的实现-tslib1.4移植
- sharesdk修改UI界面
- openCV实现图片的时钟和中心圆形扩大效果
- 【Qt】槽函数中获取发出信号的对象
- 如何修改windows10的用户文件夹名
- 等差素数列
- ECS配置Docker-swarm
- system
- 人脸识别简史与近期进展
- Android电视下的JNI demo
- 第二天学习记录
- unity导出ios工程导入到另一个工程中
- ubuntu gcc编译时对’xxxx’未定义的引用问题
- 洛谷1781宇宙总统