【蓝桥杯】最长等差素数数列

[题目]

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

  试找出区间[100,1000]内的素数构成的最大等差数列(即等差数列包含的素数个数最多)并打印输出。

[关键字]

  素数;等差数列

[思路]

  1.   先用一个数组标记出 100 ~ 1000 之间哪些是素数;
  2.   差值从 2 ~ 900 进行循环判断

[实现]

 1 #include <stdio.h>
 2 #define        N          1001
 3 #define        MAX_CHA        900
 4
 5 void isPrime(int* num);  // 判断素数
 6 void getMax(int* num);  // 获取最长等差数列
 7
 8 int main(void){
 9     int num[N] = {0};
10
11     isPrime(num);
12     getMax(num);
13
14     return 0;
15 }
16
17 void isPrime(int* num){
18     int i, j;
19
20     // i取值从1 ~ N, 判断是否是素数
21     // 素数标记 1, 合数标记为 0
22     for (i = 3; i <= N; i++){
23         num[i] = 1;
24         for (j = 2; j < i; j++){
25             if (i % j == 0){
26                 // 说明是合数, 跳出本for循环,开始判断下一个数
27                 num[i] = 0;
28                 break;
29             }
30         }
31     }
32
33 }
34
35 void getMax(int* num){
36
37     int cha;    // 差值
38     int i, j, k;
39     int count;  // 记录长度
40     int lastCount = 0;
41     int lastCha, start;
42     // 差值取值从 2 ~ 900
43     for (cha = 2; cha <= MAX_CHA; cha++){
44         // 从101开始,找出最长 素数等差数列
45         for (i = 101; i <= N; i++){
46             count = 0;  // count重置为 0
47             // 中间可能存在更长的数列
48             for (j = i; j <= N; j ++){
49                 for (k = j; k <= N; k += cha){
50                     if (num[k]){
51                         count++;  // 长度加 1
52                     }else{
53                         // 等差数列断掉,从下一个数开始
54                         // 是否找到更长的等差数列
55                         if (count > lastCount){
56                         lastCount = count;
57                         lastCha = cha;
58                         start = j;
59                         }
60                         count = 0;  // count重置为 0
61                         break;
62                     }
63                 }
64
65             }
66         }
67
68     }
69     /*
70     printf("lastCount=%d\n", lastCount);
71     printf("start=%d\n", start);
72     printf("lastCha=%d\n", lastCha);
73     */
74
75     for (i = 0; i < lastCount; i++){
76         printf("%d ", start);
77         start += lastCha;
78     }
79     printf("\n");
80 }

[结果]

  107 137 167 197 227 257

[讨论]

  有更好的做法欢迎和我讨论,我的微信号:lemonnooo

时间: 2024-11-05 02:33:09

【蓝桥杯】最长等差素数数列的相关文章

等差素数数列

程序地址:http://www.cheemoedu.com/exercise/27 问题描述: 类似7.37.67.97.107.137.167.197,这样由素数组成的数列叫做等差素数数列.素数数列具有项数的限制,一般指素数数列的项数有多少个连续项,最多可以存在多少个连续项.编程找出100以内的等差素数数列. 示例代码: 解题步骤: #1. 筛法找到100所有素数 #2. 对于素数list内素有俩两组合,构造等差数列a0, a1项 #3. 计算出a2, 查表判断a2是否是素数,是素数则能构成素

蓝桥杯-入门训练 :Fibonacci数列

问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1.当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n. 输出格式 输出一行,包含一个整数,表示Fn除以10007的余数. 说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单. 样例输入 10 样例输出 55 样例输入

蓝桥杯 最长公共子序列

给定俩个字符串,S1S2.....Sn和T1T2......Tn.求出这俩个字符串中最长的公共子序列的长度.字符串S1S2......Sn的子序列指可以表示Si1Si2.......Sim的序列 /* *最长公共子序列 ,输入俩个序列之后不断检查是否有相同出现 *如果发现字符相同,则在动态记录数组中加 1 *如果数组不相同,则选择记录 a数组减 1最大,或者选择 b数组子序列 减 1最大 * */ #include<stdio.h> #include<string.h> int N

【蓝桥杯】入门训练 Fibonacci数列

入门训练 Fibonacci数列 时间限制:1.0s   内存限制:256.0MB 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入格式 输入包含一个整数n. 输出格式 输出一行,包含一个整数,表示Fn除以10007的余数. 说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余

2017第八届蓝桥杯C/C++ B组省赛-等差素数列

标题:等差素数列 2,3,5,7,11,13,....是素数序列. 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列. 上边的数列公差为30,长度为6. 2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列. 这是数论领域一项惊人的成果! 有这一理论为基础,请你借助手中的计算机,满怀信心地搜索: 长度为10的等差素数列,其公差最小值是多少? 注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字. 比赛的时候有点混乱,结果连暴力都没暴力

蓝桥杯 入门训练 Fibonacci数列(Java)

@Author : qingdujun 入门训练 Fibonacci数列  : http://lx.lanqiao.org/problem.page?gpid=T4 import java.util.Scanner; /** * 蓝桥杯: 入门训练 Fibonacci数列 * @author qingdujun * */ public class Main { public static void main(String[] args) { int f1 = 1; int f2 = 1; int

2017第八届蓝桥杯C/C++ B组省赛个人代码

第一题 标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的. 小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定. 现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物. 取款机只能提供100元面额的纸币.小明想尽可能少取些现金,够用就行了. 你的任务是计算出,小明最少需要取多少现金. 以下是让人头疼的购物单,为了保

第二题等差素数列

第二题 标题:等差素数列 2,3,5,7,11,13,....是素数序列. 类似:7,37,67,97,127,157 这样完全由素数组成的等差数列,叫等差素数数列. 上边的数列公差为30,长度为6. 2004年,格林与华人陶哲轩合作证明了:存在任意长度的素数等差数列. 这是数论领域一项惊人的成果! 有这一理论为基础,请你借助手中的计算机,满怀信心地搜索: 长度为10的等差素数列,其公差最小值是多少? 注意:需要提交的是一个整数,不要填写任何多余的内容和说明文字. #include<iostre

第八届蓝桥杯c/c++省赛题目整理

第一题 标题: 购物单 小明刚刚找到工作,老板人很好,只是老板夫人很爱购物.老板忙的时候经常让小明帮忙到商场代为购物.小明很厌烦,但又不好推辞. 这不,XX大促销又来了!老板夫人开出了长长的购物单,都是有打折优惠的. 小明也有个怪癖,不到万不得已,从不刷卡,直接现金搞定. 现在小明很心烦,请你帮他计算一下,需要从取款机上取多少现金,才能搞定这次购物. 取款机只能提供100元面额的纸币.小明想尽可能少取些现金,够用就行了. 你的任务是计算出,小明最少需要取多少现金. 以下是让人头疼的购物单,为了保