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

[题目]

  在小于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取值从3 ~ 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

转载于:https://www.cnblogs.com/lemonno/p/6685182.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值