[题目]
在小于10的素数中有3、5、7组成的等差数列,在小于30的素数中有11、17、23、29组成的等差数列。
试找出区间[100,1000]内的素数构成的最大等差数列(即等差数列包含的素数个数最多)并打印输出。
[关键字]
素数;等差数列
[思路]
- 先用一个数组标记出 100 ~ 1000 之间哪些是素数;
- 差值从 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