C语言—程序设计入门—PTA练习题 7-166均是素数

题目内容:

在给定的区间 [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;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值