「PAT乙级真题解析」Basic Level 1091 N-自守数 (问题分析+完整步骤+伪代码描述+提交通过代码)
题目给定一个定义, 给定一组数, 要求输出能够让每个数符合题设定义的正整数, 不存在这样的正整数时输出"No". 需要满足的条件是, 正整数N乘以给定的数K的平方得到的乘积以K为结尾。
#算法#数据结构#pat考试#c语言#需求分析
Table of Contents
乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。
PAT (Basic Level) Practice 1091 N-自守数
问题分析
题目给定一个定义, 给定一组数, 要求输出能够让每个数符合题设定义的正整数, 不存在这样的正整数时输出"No". 需要满足的条件是, 正整数N乘以给定的数K的平方得到的乘积以K为结尾。
如何检查一个数是否以另一个数结尾
方案一: 如果是以数值形式存储两个数
要获取某个数值各个数位上的数字,需要使用取余从后往前获取。 所以如果两个数都是以数值形式存储, 需要同时对两个数对10取余,如果余数不同则说明不满足要求。 如果直到某一个数等于0, 都没有出现余数不同的情况, 则满足要求。
方案二: 如果是以字符串形式存储两个数
计算较短的数的位数, 然后直接使用索引访问比较。
完整描述过程
- 获取输入: 要检查的正整数个数, 给定的各个正整数
- 对于各个正整数:
- 系数从1到9, 进行以下检查:
- 如果系数乘以正整数平方得到的乘积, 以正整数结尾, 则:
- 输出这个系数以及得到的乘积。
- 直接进入下一个正整数的处理
- 如果系数乘以正整数平方得到的乘积, 以正整数结尾, 则:
- 如果系数从1到9都不符合要求, 则输出"No".
- 系数从1到9, 进行以下检查:
伪代码描述
- get input: case_amount;
- for each case:
- get input: number
- init flag:
- found = False
- calculate square = number * number;
- for coefficient in range(1, 10):
- calculate product = coefficient * square;
- if is_postfix(number, product):
- found = True;
- print("{number} {product}");
- break;
- if not found:
- print("No")
完整提交代码
/*
# 问题分析
题目给定一个定义, 给定一组数, 要求输出能够让每个数符合题设定义的正整数, 不存在这样的正整数时输出"No".
需要满足的条件是, 正整数N乘以给定的数K的平方得到的乘积以K为结尾。
## 如何检查一个数是否以另一个数结尾
### 方案一: 如果是以数值形式存储两个数
要获取某个数值各个数位上的数字,需要使用取余从后往前获取。
所以如果两个数都是以数值形式存储, 需要同时对两个数对10取余,如果余数不同则说明不满足要求。
如果直到某一个数等于0, 都没有出现余数不同的情况, 则满足要求。
### 方案二: 如果是以字符串形式存储两个数
计算较短的数的位数, 然后直接使用索引访问比较。
# 完整描述过程
1. 获取输入: 要检查的正整数个数, 给定的各个正整数
2. 对于各个正整数:
- 系数从1到9, 进行以下检查:
- 如果系数乘以正整数平方得到的乘积, 以正整数结尾, 则:
- 输出这个系数以及得到的乘积。
- 直接进入下一个正整数的处理
- 如果系数从1到9都不符合要求, 则输出"No".
# 伪代码描述
1. get input: case_amount;
2. for each case:
- get input: number
- init flag:
- found = False
- calculate square = number * number;
- for coefficient in range(1, 10):
- calculate product = coefficient * square;
- if is_postfix(number, product):
- found = True;
- print("{number} {product}");
- break;
- if not found:
- print("No")
*/
# include<stdio.h>
int meet_condition(int number, int result){
while (number != 0){
int remainder = number % 10;
if (result % 10 != remainder){
return 0;
}
number /= 10;
result /= 10;
}
return 1;
}
int main(){
int case_amount;
scanf("%d", &case_amount);
int number, square, result;
int found;
for (int i = 0; i < case_amount; i++){
scanf("%d", &number);
square = number * number;
found = 0;
for (int j = 1; j < 10; j++){
result = square * j;
if (meet_condition(number, result) == 1){
printf("%d %d\n", j, result);
found = 1;
break;
}
}
if (found == 0){
printf("No\n");
}
}
return 0;
}