「PAT乙级真题解析」Basic Level 1099 性感素数 (问题分析+完整步骤+伪代码描述+提交通过代码)

题设定义满足(p, p+6)都是素数的p和p+6两个数都是性感素数。 给定正整数N, 要求检查N是否是性感素数。 如果是, 则输出"Yes"以及和N配对的较小的性感素数。 如果不是, 则输出大于N的最小性感素数。

#算法#pat考试#数据结构#需求分析#c语言

Table of Contents

乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。

PAT (Basic Level) Practice 1099 性感素数

问题分析

  • 题设定义满足(p, p+6)都是素数的p和p+6两个数都是性感素数。
  • 给定正整数N, 要求检查N是否是性感素数。
  • 如果是, 则输出"Yes"以及和N配对的较小的性感素数。
  • 如果不是, 则输出大于N的最小性感素数。

完整描述步骤

  1. 获取输入: 正整数N
  2. 如果 N 和 N-6 都是素数:
    • 输出"Yes"
    • 输出N-6
    • 结束程序
  3. 如果 N 和 N+6 都是素数:
    • 输出"Yes"
    • 输出N+6
    • 结束程序
  4. 如果 N 不是素数, 则:
    • 输出"No"
    • 依次检查大于N的数值X:
      • 如果 X 和 X-6 都是素数:
        • 输出X
        • 结束程序
      • 如果 X 和 X+6 都是素数:
        • 输出X
        • 结束程序

伪代码描述

  1. get input: number
  2. if is_prime_number(number) and is_prime_number(number-6):
    • print("Yes");
    • print(number-6);
    • end procedure;
  3. if is_prime_number(number) and is_prime_number(number+6):
    • print("Yes");
    • print(number+6);
    • end procedure;
  4. print("No");
  5. new_number = number + 1;
  6. while True:
    • if is_prime_number(new_number) and is_prime_number(new_number-6):
      • print(number);
      • break;
    • if is_prime_number(new_number) and is_prime_number(new_number+6):
      • print(number);
      • break;

注意事项

  1. 测试点3. N不是性感素数, 大于N的最小性感素数X满足(X-6,X)是性感素数对。
  2. 测试点2. 输入样例: 1

完整提交代码

/*
# 问题分析
题设定义满足(p, p+6)都是素数的p和p+6两个数都是性感素数。
给定正整数N, 要求检查N是否是性感素数。
如果是, 则输出"Yes"以及和N配对的较小的性感素数。
如果不是, 则输出大于N的最小性感素数。
 
# 完整描述步骤
1. 获取输入: 正整数N
2. 如果 N 和 N-6 都是素数:
    - 输出"Yes"
    - 输出N-6
    - 结束程序
3. 如果 N 和 N+6 都是素数:
    - 输出"Yes"
    - 输出N+6
    - 结束程序
4. 如果 N 不是素数, 则:
    - 输出"No"
    - 依次检查大于N的数值X:
        - 如果 X 和 X-6 都是素数:
            - 输出X
            - 结束程序
        - 如果 X 和 X+6 都是素数:
            - 输出X
            - 结束程序
 
# 伪代码描述
1. get input: number
2. if is_prime_number(number) and is_prime_number(number-6):
    - print("Yes");
    - print(number-6);
    - end procedure;
3.  if is_prime_number(number) and is_prime_number(number+6):
    - print("Yes");
    - print(number+6);
    - end procedure;
4. print("No");
5. new_number = number + 1;
6. while True:
    - if is_prime_number(new_number) and is_prime_number(new_number-6):
        - print(number);
        - break;
    - if is_prime_number(new_number) and is_prime_number(new_number+6):
        - print(number);
        - break;
 
# 注意事项
1. 测试点3. N不是性感素数, 大于N的最小性感素数X满足(X-6,X)是性感素数对。
2. 测试点2. 输入样例: 1
*/
 
 
# include<stdio.h>
# include<math.h>
 
 
int is_prime_number(int number){
    if (number < 2){
        return 0;
    }
       
    if (number == 2){
        return 1;
    }
    
    int digit = number % 10;
    
    if (digit != 1 && digit != 3 && digit != 5 && digit != 7 && digit != 9 ){
        return 0;
    }
    
    for(int i = 2; i <= sqrt(number); i++){
        if(number % i == 0){
            return 0;
        }
    }
 
    return 1;
}
 
int main(){
    int number;
    scanf("%d", &number);
 
    if (is_prime_number(number) && is_prime_number(number - 6)){
        printf("Yes\n%d", number - 6);
        return 0;
    }
 
    if (is_prime_number(number)  && is_prime_number(number + 6)){
        printf("Yes\n%d", number + 6);
        return 0;
    }
 
    printf("No\n");
    for (int i = number + 1; ;i++){
        if (is_prime_number(i) && is_prime_number(i-6)){
            printf("%d", i);
            break;
        }
        if (is_prime_number(i) && is_prime_number(i+6)){
            printf("%d", i);
            break;
        }
    }
    
    return 0;
}
「PAT乙级真题解析」Basic Level 1099 性感素数 (问题分析+完整步骤+伪代码描述+提交通过代码) | 生活糖果