素数中的等差数列

链接:https://ac.nowcoder.com/acm/contest/19859/I
来源:牛客网

题目描述

质数是在数论中很有意思的数,有很多题都可以围绕它来出,就如你眼前所见的这道题。
给定一个闭区间[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

解决方案

#include<stdio.h>
#include<math.h>
int main()
{
    int a,b;
    scanf("%d %d",&a,&b);
    int i,j,k=0,prime[100000];
    for(i=a;i<=b;i++)
    {//首先要找出范围内的所有素数,存入数组中
        if(i==2||i==3)
            prime[k++]=i;
        for(j=2;j<=sqrt(i);j++)
        {//这里要用>=号,因为有可能满足某个数的平方不为素数,例如361=19*19
            if(i%j==0)
                break;
        }
        if(j>sqrt(i))
            prime[k++]=i;
    }
    for(i=0;i<k;i++)//这个k就是素数数组元素个数
    {//判断是否满足等差数列公式
        if(prime[i+1]-prime[i]==prime[i+2]-prime[i+1])
        {
            while(prime[i+1]-prime[i]==prime[i+2]-prime[i+1])
            {//这里用while原因是素数等差数列可能有多项,我们始终输出i这项,当时要注意i++
                printf("%d ",prime[i]);
                i++;
                //注意需要三个i++,这里,下面,for循环中
                //(解释:prime[i]为151的时候,i++,prime[i]就是157,prime[i+1]就是163,下面i++,prime[i]为163,for循环再i++,就开始判断163下一位素数是否满足等差数列了)
            }
            printf("%d %d\n",prime[i],prime[i+1]);//不满足递推公式后将后两项也输出
            i++;
        }
    }
    return 0;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值