首页 > 代码库 > 【蓝桥杯】最长等差素数数列

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

[题目]

  在小于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

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