列表

详情


NC208815. 素数中的等差数列

描述

质数是在数论中很有意思的数,有很多题都可以围绕它来出,就如你眼前所见的这道题。
给定一个闭区间[a,b],将此范围内的所有素数进行从小到大排序,对于连续的素数,我们可以发现很多等差数列(元素个数大于等于3),现在就请你完成这个任务。
对于给定的闭区间[a,b],你要找出里面所有的等差数列,并输出所有的等差数列。
这里有一个要求,同一个数不能同时存在于两个等差数列中。
比如a, b, c, d,e中,a, b, c是一个等差数列,c, d, e也是一个等差数列,后一个等差数列就不能以c开始,所以c, d, e在本题不构成等差数列。

输入描述

输入占一行,只包含两个数a和b,并用空格隔开。a<b,a<=1000,b<=100000

输出描述

输出占若干行,每行为一个等差数列,每个数用空格隔开

示例1

输入:

141 400

输出:

151 157 163 
167 173 179
199 211 223 
251 257 263 269 
367 373 379

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 13ms, 内存消耗: 468K, 提交时间: 2023-05-30 22:38:59

#include<stdio.h>
int pd(int n)
{for(int i=2;i*i<=n;i++)
    {if(n%i==0){return 0;}}
    return 1;}
int main()
{ int n,b,i,j,t=0,k;int a[10001];
 scanf("%d %d",&n,&b);
 for (i=n;i<=b;i++)
 {if(pd(i)==1){a[t]=i;t++;}}
 i=1;k=2;
 while(i<t-1)
 {  while(a[i]+a[i]==a[i-1]+a[i+1])
     {k++;i++;}
 if(k==2) {i++;}
 if(k>=3)
 {for(j=i+1-k;j<=i;j++)
 {printf("%d ",a[j]);}
    printf("\n");
    i=i-1+k;
    k=2;}
    } return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 693ms, 内存消耗: 444K, 提交时间: 2023-07-20 11:44:50

#include<iostream>
using namespace std;
int main()
{
int a,b,c[100010],x=0,i,j;
cin>>a>>b;
for(i=a;i<=b;i++)
{
for(j=2;j<=i/2;j++)
{
if(i%j==0)
break;
}
if(j>i/2)
{
c[x]=i;
x++;
}
}
for(i=1;i<x;i++)
{
if(c[i] - c[i - 1] == c[i + 1] - c[i]){
int d = c[i] - c[i - 1];
cout << c[i - 1];
for(; i < x && c[i] - c[i - 1] == d; i++)
cout << ' ' << c[i];
cout << endl;
}
}
}

上一题