洛谷: 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;
}

posted @ 2024-02-19 03:20  YuKiCheng  阅读(79)  评论(0编辑  收藏  举报  来源