题目内容:
在给定的区间 [m,n] 内,是否存在素数 p、q、r(p<q<r),使得 pq+r、qr+p、rp+q 均是素数?
输入格式:
输入给出区间的两个端点 0<m<n≤1000,其间以空格分隔。
输出格式:
在一行中输出满足条件的素数三元组的个数。
输入样例:
1 35
输出样例:
10
样例解读:
2, 3, 5
2, 3, 7
2, 3, 13
2, 3, 17
2, 5, 7
2, 5, 13
2, 5, 19
2, 5, 31
2, 7, 23
2, 13, 17
答题代码:
#include <stdio.h>
#include <math.h>
int isPrime(int num);
int theleftprime(int *primenum,int maxlen,int num);
int therightprime(int *primenum,int maxlen,int num);
int main(){
int m,n,start,end;
scanf("%d %d",&m,&n);
int i=0,cnt=0;
int primenum[168]; //已事先运行程序求得[0,1000]区间中素数共168个
for (int j = 2; j <= 1000;){ //先建立循环得到[0,1000]区间中所有168个素数的数组
if (isPrime(j)){
primenum[i++]=j;
cnt++;
}
if (j%2==0){
j++;
}else{
j+=2;
}
}
start=theleftprime(primenum,168,m); //start赋值为[m,n]区间中存在的最小素数对应primenum数组的索引
end=therightprime(primenum,168,n); //end赋值为[m,n]区间中存在的最大素数对应primenum数组的索引
int matchnum=0; //matchnum用于计算存在符合题目条件的结果次数
if (end-start>=2){ //当区间中至少存在3个不同的素数时进入判定
for (int i = start; i <= end-2 ; ++i){
for (int j = i+1; j <= end-1; ++j){
for (int k = j+1; k <= end; ++k){
if (isPrime(primenum[i]*primenum[j]+primenum[k])&&isPrime(primenum[i]*primenum[k]+primenum[j])&&isPrime(primenum[j]*primenum[k]+primenum[i])){
matchnum++;
}
}
}
}
}
printf("%d\n",matchnum );
return 0;
}
int isPrime(int num){
int ret=1;
if (num<=1){
ret=0;
}else if (num>=2){
for (int i = 2; i <= sqrt(num); ++i){
if (num%i==0){
ret=0;
break;
}
}
}
return ret;
}
int theleftprime(int *primenum,int maxlen,int num){
int ret=0;
for (int i = 0; i < maxlen; ++i){
if (primenum[i]>=num){
ret=i;
break;
}
}
return ret;
}
int therightprime(int *primenum,int maxlen,int num){
int ret=167;
for (int i = 167; i >= 0; i--){
if (primenum[i]<=num){
ret=i;
break;
}
}
return ret;
}