本道题和另外一道有借鉴意义
https://blog.csdn.net/AFANTI_JK/article/details/104538664
这是第一次有点错误的
#include <stdio.h>
#define MAX_n 100000 /* 素数的范围 */
#define YES 1 /* 是素数 */
void get_primes(int s[], int lim){
int i, j;
for(i = 2; i < lim; ++i){
for(j = 2; j <= i / 2; ++j)
if(i % j == 0) /* 不是素数 */
break;
if(j > (i / 2)) /* 是素数 */
s[i] = YES;
}
}
int count(int s[], int lim){
int i, last_primes;
int sum = 0; /* 记录出现了多少对 */
last_primes = 2; /* 第一个素数为2 */
for(i = 2; i < lim; ++i){
while(s[i] != YES && i < lim) /* 找一个素数 */
++i;
if(s[i] == YES){ /* 若找到了 */
if(i - last_primes == 2){ /* 若差为2 */
++sum; /* 记录 */
last_primes = i;
}else
last_primes = i;
}
}
return sum;
}
int main(){
int n;
int primes[MAX_n] = {0};
scanf("%d", &n);
get_primes(primes, n+1); /* 得到素数数组 */
printf("%d", count(primes, n+1)); /* 输出右多少对 */
}
由于求素数表的代码不假,改
其实一大于8的数只要不能被小于8的正整数(except 1)所整除,它就素数(还有个前提你是要把数值比较小的素数的倍数都要标记为不是素数),改
#include <stdio.h>
#define MAX_n 100000 /* 素数的范围 */
#define YES 1 /* 是素数 */
#define NO 2 /* 不是素数 */
void get_primes(int s[], int lim){
int i, j;
int mult;
for(i = 2; i < lim; ++i){
if(s[i] != NO){
mult = 2;
for(j = i; j*mult < lim; ++mult)
s[j*mult] = NO; /* 将所有当前要判断的数的倍数标记为不是素数*/
for(j = 2; j <= i/2 && j < 8; ++j){
if(i % j == 0) /* 大于8的数,只要这个数被8以内的数除不尽 */
break;
}
if(j > i/2 || j >= 8)
s[i] = YES; /* 它就是素数 */
}
}
}
int count(int s[], int lim){
int i, last_primes;
int sum = 0; /* 记录出现了多少对 */
last_primes = 2; /* 第一个素数为2 */
for(i = 2; i < lim; ++i){
while(s[i] != YES && i < lim) /* 找一个素数 */
++i;
if(s[i] == YES){ /* 若找到了 */
if(i - last_primes == 2){ /* 若差为2 */
++sum; /* 记录 */
last_primes = i;
}else
last_primes = i;
}
}
return sum;
}
int main(){
int n;
int primes[MAX_n] = {0};
scanf("%d", &n);
get_primes(primes, n+1); /* 得到素数数组 */
printf("%d", count(primes, n+1)); /* 输出右多少对 */
}