「PAT乙级真题解析」Basic Level 1096 大美数 (问题分析+完整步骤+伪代码描述+提交通过代码)
乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。
PAT (Basic Level) Practice 1096 大美数
问题分析
- 题目要求过于明确, 只想到用穷举法。
- 由于是检查4个正因数之和是否能被原整数整除,所以穷举需要写四重循环。
- 由于因数组合的顺序不影响因数和, 即也不影响被原整数整除, 所以内层循环都以上一层循环的值+1作为初始值。
完整描述步骤
- 获取输入: 正整数个数, 各个正整数
- 对于每一个正整数:
- 初始化标志位:
- 找到了满足条件的组合标志位 = False
- 设置四层循环, 对于每一层循环:
- 先检查标志位是否为True, 如果为真直接break
- 如果当前循环的数值不能被当前检查的正整数整除, 直接continue
- 在第四层循环时才列举齐全需要检查的4个正因数组合, 第二层进行检查:
- 如果正整数能够整除这4个正因数的和:
- 找到了满足条件的组合标志位 = True
- 如果正整数能够整除这4个正因数的和:
- 如果 标志位 为 True:
- 输出"Yes"
- 否则:
- 输出"No"
- 初始化标志位:
伪代码描述
- get input: case_amount
- for each case:
- get input: number
- init recorder:
- is_met_conditions = False
- for a in range(1, number):
- if is_met_conditions: break;
- if number % a != 0: continue;
- for b in range(a+1, number):
- if is_met_conditions: break;
- if number % b != 0: continue;
- for c in range(b+1, number):
- if is_met_conditions: break;
- if number % c != 0: continue;
- for d in range(c+1, number):
- if is_met_conditions: break;
- if number % d != 0: continue;
- if number % (a+b+c+d) == 0:
- is_met_conditions = True
- if is_met_conditions:
- print(“Yes”)
- else:
- print(“No”)
完整提交代码
/*
# 问题分析
题目要求过于明确, 只想到用穷举法。
由于是检查4个正因数之和是否能被原整数整除,所以穷举需要写四重循环。
由于因数组合的顺序不影响因数和, 即也不影响被原整数整除, 所以内层循环都以上一层循环的值+1作为初始值。
# 完整描述步骤
1. 获取输入: 正整数个数, 各个正整数
2. 对于每一个正整数:
- 初始化标志位:
- 找到了满足条件的组合标志位 = False
- 设置四层循环, 对于每一层循环:
- 先检查标志位是否为True, 如果为真直接break
- 如果当前循环的数值不能被当前检查的正整数整除, 直接continue
- 在第四层循环时才列举齐全需要检查的4个正因数组合, 第二层进行检查:
- 如果正整数能够整除这4个正因数的和:
- 找到了满足条件的组合标志位 = True
- 如果 标志位 为 True:
- 输出"Yes"
- 否则:
- 输出"No"
# 伪代码描述
1. get input: case_amount
2. for each case:
- get input: number
- init recorder:
- is_met_conditions = False
- for a in range(1, number):
- if is_met_conditions: break;
- if number % a != 0: continue;
- for b in range(a+1, number):
- if is_met_conditions: break;
- if number % b != 0: continue;
- for c in range(b+1, number):
- if is_met_conditions: break;
- if number % c != 0: continue;
- for d in range(c+1, number):
- if is_met_conditions: break;
- if number % d != 0: continue;
- if number % (a+b+c+d) == 0:
- is_met_conditions = True
- if is_met_conditions:
- print("Yes")
- else:
- print("No")
*/
# include<stdio.h>
int is_super_beautiful_number(int number){
int flag = 0;
for(int a = 1; a < number; a++){
if (flag) break;
if (number % a != 0) continue;
for(int b = a+1; b < number; b++){
if (flag) break;
if (number % b != 0) continue;
for(int c = b+1; c < number; c++){
if (flag) break;
if (number % c != 0) continue;
for(int d = c+1; d <= number; d++){
if (flag) break;
if (number % d != 0) continue;
if ((a + b + c + d) % number == 0){
flag = 1;
}
}
}
}
}
return flag;
}
int main(){
int case_amount;
scanf("%d", &case_amount);
int number, flag;
for (int i = 0; i < case_amount; i++){
scanf("%d", &number);
int is_met_conditions = is_super_beautiful_number(number);
if (is_met_conditions){
printf("Yes\n");
} else {
printf("No\n");
}
}
return 0;
}