我的PAT-BASIC代码仓:https://github.com/617076674/PAT-BASIC
原题链接:https://pintia.cn/problem-sets/994805260223102976/problems/994805284923359232
题目描述:
知识点:数据越界
思路:转换为Knut相减,再转换为Galleon.Sickle.Knut的格式输出结果
注意要用long型变量来保存转换为Knut的结果,int型会越界。
本题数据输入都是固定格式的,分析时间复杂度和空间复杂度意义不大,都是常数级别的。
C++代码:
#include<iostream>
#include<string>
#include<sstream>
using namespace std;
long changeToKnut(string s);
string changeToGalleonSickleKnut(long num);
int main(){
string input1;
string input2;
cin >> input1 >> input2;
long num1 = changeToKnut(input1);
long num2 = changeToKnut(input2);
if(num1 <= num2){
cout << changeToGalleonSickleKnut(num2 - num1);
}else{
cout << "-" << changeToGalleonSickleKnut(num1 - num2);
}
return 0;
}
long changeToKnut(string s){
int indexPoint1 = -1;
for(int i = 0; i < s.length(); i++){
if(s[i] == '.'){
indexPoint1 = i;
break;
}
}
int indexPoint2 = -1;
for(int i = indexPoint1 + 1; i < s.length(); i++){
if(s[i] == '.'){
indexPoint2 = i;
break;
}
}
long galleon = 0;
for(int i = 0; i < indexPoint1; i++){
galleon = galleon * 10 + (s[i] - '0');
}
long sickle = 0;
for(int i = indexPoint1 + 1; i < indexPoint2; i++){
sickle = sickle * 10 + (s[i] - '0');
}
long knut = 0;
for(int i = indexPoint2 + 1; i < s.length(); i++){
knut = knut * 10 + (s[i] - '0');
}
return galleon * 17 * 29 + sickle * 29 + knut;
}
string changeToGalleonSickleKnut(long num){
long galleon = num / (29 * 17);
long sickle = (num - galleon * 29 * 17) / 29;
long knut = num - galleon * 29 * 17 - sickle * 29;
ostringstream os;
os << galleon << "." << sickle << "." << knut;
return os.str();
}
C++解题报告: