C语言蓝桥杯刷题:等差素数列

题目链接
在这里插入图片描述

解题思路

该题我采用的是暴力求解的方法:假设我们要找的长度为10的等差素数列为arr[10],
因为是等差素数列,所以已经是确定了这个数列里面均为素数。

也就是说:
假设arr[0]是长度为10的等差素数数列中第一个
arr[9]是长度为10的等差素数数列中最后一个
arr[0]和arr[9]之间差值为9 * d,
arr[0]和arr[y]之间差值为y * d, 1<=y<=9

那么我们可以先确定一个素数arr[0],然后在这个arr[0]的基础上,for循环遍历公差d,
去判断arr[y]=arr[0]+y*d是否为素数,若arr[1]到arr[9]均为素数,
也就说10个长度的等差素数列已找到,那么我们的d也就确定了。

代码如下

#include <stdio.h>
#include <stdlib.h>
int IsPrimes(int x)//判断是否是素数,是返回1,不是返回0
{
	if (x == 1)
	{
		return 0;
	}
	if (x == 2)
	{
		return 1;
	}
	for (int i = 2;i < x;i++)
	{
		if (x%i == 0)
		{
			return 0;
		}
	}
	return 1;
}

int main(int argc, char *argv[])
{
	//假设arr[0]是长度为10的等差素数数列中第一个
	//    arr[9]是长度为10的等差素数数列中最后一个
	//arr[0]和arr[9]之间差值为9*d,
	//arr[0]和arr[y]之间差值为y*d, 1<=y<=9

	int count = 0;
	for (int i = 2;i < 10000;i++)//遍历素数
	{
		if (IsPrimes(i))//arr[0]初步确定
		{
			for (int d = 1;d < 1000;d++)
			{
				for (int j = 1;j < 10;j++)//首项已经判断好是素数的,我们这里直接从+1d开始判断到+9d
				{
					if (IsPrimes(i + j * d))
					{
						count++;
					}
					else
					{
						count = 0;
						break;
					}

					if (count == 9)//已找到需要的d
					{
						printf("%d", d);
						return 0;
					}
				}

			}
		}
	}

	return 0;
}

需要注意的是,d<1000这个大致范围你要给一下(你也可以是d<500,d<300等等),
不然你直接for (int d = 1;d ;d++),d就会一直增加,然后i一直是2,i永远无法往后进行判断

而i<10000这个大致范围也要给一下,否则可能因为你遍历的i比较少,
你给的i全找完了也没有找到符合要求的等差素数列。
在这里插入图片描述

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

劲夫学编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值