洛谷: P1553 数字反转(升级版)
思路: 没想到什么好办法,一步一步来。整体就是反转,删除前导/后导0,反转,删除前导/后导0。
第一次AC没过去,原因是没考虑到分数的分母前导0的情况,比如1234567890/1234567890这个样例,结果输出应该是987654321/987654321才对。所以如果是分数的话,相较于小数,需要多考虑这种情况。
代码看起来挺多,是因为重复的代码挺多的。
代码:
#include <bits/stdc++.h>
using namespace std;
int main() {
string s;
cin >> s;
if (s.find(".")!=string::npos || s.find("/")!=string::npos) {
int x = 0;
if (s.find(".")!=string::npos) {
x = s.find(".");
}
else {
x = s.find("/");
}
//0到x-1是一段 然后x+1到s.length()-1是一段
reverse(s.begin(),s.begin() + x);
int index = 0;
while (x - index > 1 && s[index] == '0') {
index++;
}
reverse(s.begin() + x + 1, s.end());
int index2 = s.length() - 1;
while (index2 - x > 1 && s[index2] == '0') {
index2--;
}
int index3 = x + 1;
if (s.find("/") != string::npos) {
while (index2 - index3 > 0 && s[index3] == '0') {
index3++;
}
}
if (s.find(".")!=string::npos) {
cout << s.substr(index, x - index) + "." + s.substr(x + 1, index2 - x) << endl;
}
else {
cout << s.substr(index, x - index) + "/" + s.substr(index3,index2 - index3 + 1) << endl;
}
}
else if (s.find("%")!=string::npos) {
int x = s.find("%");
reverse(s.begin(), s.begin() + x);
int index = 0;
while (x - index > 1 && s[index] == '0') {
index++;
}
cout << s.substr(index) << endl;
}
else {
reverse(s.begin(), s.end());
int index = 0;
while (s.length() - index > 1 && s[index] == '0') {
index++;
}
cout << s.substr(index) << endl;
}
return 0;
}