「PAT乙级真题解析」Basic Level 1037 在霍格沃茨找零钱 (问题分析+完整步骤+伪代码描述+提交通过代码)
这道题中涉及的这种转换类似于"时:分:秒"的转化。 按照这个思路, 我们可以构造一个从"Galleon.Sickle.Knut"转为完全转为Knut值的方法, 同时构造一个从完全以Knut计算的数值转化为"Galleon.Sickle.Knut". 则题目可以转换为: 将给定的两个格式为"Galleon.Sickle.Knut"的值转为完全Knut值, 计算二者的差值, 然后将差值转回"Galleon.Sickle.Knut"的格式
#算法#数据结构#需求分析#c语言#pat考试
Table of Contents
乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。
问题分析
这道题中涉及的这种转换类似于"时:分:秒"的转化。 按照这个思路, 我们可以构造一个从"Galleon.Sickle.Knut"转为完全转为Knut值的方法, 同时构造一个从完全以Knut计算的数值转化为"Galleon.Sickle.Knut". 则题目可以转换为: 将给定的两个格式为"Galleon.Sickle.Knut"的值转为完全Knut值, 计算二者的差值, 然后将差值转回"Galleon.Sickle.Knut"的格式
差值为负数的情况
只需要标记差值为负数, 然后将绝对值转为"Galleon.Sickle.Knut"格式的值, 最后在输出的时候如果差值为负数的标记为true, 则先输出一个负号.
完整描述过程
- 获取输入
- 将输入的两个值转为完全Knut的形式
- 计算二者差值
- 将差值转回"Galleon.Sickle.Knut"的形式
伪代码描述
- get input should_pay, actually_paid
- difference = convert_complete_form_to_only_Knut(actually_paid) - convert_complete_form_to_only_Knut(should_pay)
- print convert_only_Knut_to_complete_form(difference)
完整提交代码
/*
# 问题分析
这道题中涉及的这种转换类似于"时:分:秒"的转化。
按照这个思路, 我们可以构造一个从"Galleon.Sickle.Knut"转为完全转为Knut值的方法,
同时构造一个从完全以Knut计算的数值转化为"Galleon.Sickle.Knut".
则题目可以转换为: 将给定的两个格式为"Galleon.Sickle.Knut"的值转为完全Knut值,
计算二者的差值, 然后将差值转回"Galleon.Sickle.Knut"的格式
## 差值为负数的情况
只需要标记差值为负数, 然后将绝对值转为"Galleon.Sickle.Knut"格式的值,
最后在输出的时候如果差值为负数的标记为true, 则先输出一个负号.
# 完整描述过程
1. 获取输入
2. 将输入的两个值转为完全Knut的形式
3. 计算二者差值
4. 将差值转回"Galleon.Sickle.Knut"的形式
# 伪代码描述
1. get input should_pay, actually_paid
2. difference = convert_complete_form_to_only_Knut(actually_paid) - convert_complete_form_to_only_Knut(should_pay)
3. print convert_only_Knut_to_complete_form(difference)
*/
int convert_complete_form_to_only_Knut(char *value){
int Galleon = 0;
int Sickle = 0;
int Knut = 0;
int index = 0;
for(; value[index] && value[index] != '.'; index++){
Galleon = Galleon * 10 + (int)value[index] - 48;
}
index++;
for(; value[index] && value[index] != '.'; index++){
Sickle = Sickle * 10 + (int)value[index] - 48;
}
index++;
for(; value[index] && value[index] != '.'; index++){
Knut = Knut * 10 + (int)value[index] - 48;
}
return Galleon * 17 * 29 + Sickle * 29 + Knut;
}
void print_value_as_complete_form(int value){
int is_negative = 0;
if (value < 0){
is_negative = 1;
value = -value;
}
int Galleon = value / (17 * 29);
int Sickle = (value % (17 * 29)) / 29;
int Knut = value % 29;
if (is_negative == 1)
printf("-");
printf("%d.%d.%d\n", Galleon, Sickle, Knut);
}
int main(){
char should_pay[14];
char actually_paid[14];
scanf("%s %s\n", should_pay, actually_paid);
int difference = convert_complete_form_to_only_Knut(actually_paid) - convert_complete_form_to_only_Knut(should_pay);
print_value_as_complete_form(difference);
return 0;
}