「PAT乙级真题解析」Basic Level 1101 B是A的多少倍 (问题分析+完整步骤+伪代码描述+提交通过代码)
题设明确要求按照其给定的步骤变换给定的正整数, 然后输出变换后的正整数是输入正整数的多少倍。 所以重点在于转换逻辑的编写。由于给定的正整数不大于10的9次方, 所以可以用整型存储。 但是涉及到部分数位的移动, 使用整型时获取各个数位的数字时需要从后往前, 这里不太适合, 所以最佳方式时使用字符串存储正整数, 变换之后得到新的字符串, 然后将两个字符串转换为整型后相除。
#算法#数据结构#需求分析#pat考试#c语言
Table of Contents
乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。
PAT (Basic Level) Practice 1101 B是A的多少倍
问题分析
题设明确要求按照其给定的步骤变换给定的正整数, 然后输出变换后的正整数是输入正整数的多少倍。 所以重点在于转换逻辑的编写。由于给定的正整数不大于10的9次方, 所以可以用整型存储。 但是涉及到部分数位的移动, 使用整型时获取各个数位的数字时需要从后往前, 这里不太适合, 所以最佳方式时使用字符串存储正整数, 变换之后得到新的字符串, 然后将两个字符串转换为整型后相除。
完整描述步骤
- 获取输入: 正整数A, 需要截取的位数D
- 初始化正整数B(字符串形式)
- 从A的倒数第D位开始到最后一位:
- 将当前数字字符加到字符串B的末尾
- 从A的第一位开始到倒数第D位:
- 将当前数字字符加到字符串B的末尾
- 转换A和B为数值类型
- 输出B除以A的结果(保留2位小数)
伪代码描述
- get input: origin_number, cut_width
- init new_number;
- for i in range(length(origin_number) - cut_width, length(origin_number)):
- new_number += origin_number[i]
- for i in range(0, length(origin_number) - cut_width):
- new_number += origin_number[i]
- print(int(new_number) / int(origin_number))
完整提交代码
/*
# 问题分析
题设明确要求按照其给定的步骤变换给定的正整数, 然后输出变换后的正整数是输入正整数的多少倍。
所以重点在于转换逻辑的编写。由于给定的正整数不大于10的9次方, 所以可以用整型存储。
但是涉及到部分数位的移动, 使用整型时获取各个数位的数字时需要从后往前, 这里不太适合,
所以最佳方式时使用字符串存储正整数, 变换之后得到新的字符串, 然后将两个字符串转换为整型后相除。
# 完整描述步骤
1. 获取输入: 正整数A, 需要截取的位数D
2. 初始化正整数B(字符串形式)
3. 从A的倒数第D位开始到最后一位:
- 将当前数字字符加到字符串B的末尾
4. 从A的第一位开始到倒数第D位:
- 将当前数字字符加到字符串B的末尾
5. 转换A和B为数值类型
6. 输出B除以A的结果(保留2位小数)
# 伪代码描述
1. get input: origin_number, cut_width
2. init new_number;
3. for i in range(length(origin_number) - cut_width, length(origin_number)):
- new_number += origin_number[i]
4. for i in range(0, length(origin_number) - cut_width):
- new_number += origin_number[i]
5. print(int(new_number) / int(origin_number))
*/
# include<stdio.h>
int calculate_number_length(char* number){
int length = 0;
for (int i = 0; number[i]; i++){
length++;
}
return length;
}
int transform_number(char* origin_number, int cut_width, char *new_number){
int length = calculate_number_length(origin_number);
new_number[length] = 0;
for (int i = length - cut_width; i < length; i++){
new_number[i+cut_width-length] = origin_number[i];
}
for (int i = 0; i < length - cut_width; i++){
new_number[i+cut_width] = origin_number[i];
}
}
double calculate_multiple(char* origin_number, char* new_number){
int length = calculate_number_length(origin_number);
int divisor = 0, dividend = 0;
for (int i = 0; i < length; i++){
divisor = divisor * 10 + (origin_number[i] - '0');
dividend = dividend * 10 + (new_number[i] - '0');
}
return (double)dividend / divisor;
}
int main(){
char origin_number[11];
int cut_width;
scanf("%s %d", origin_number, &cut_width);
char new_number[11];
transform_number(origin_number, cut_width, new_number);
printf("%.2f", calculate_multiple(origin_number, new_number));
return 0;
}