P1553 數字反轉(升級版)

題目描述

給定一個數,請將該數各個位上數字反轉得到一個新數。

這次與NOIp2011普及組第一題不同的是:這個數可以是小數,分數,百分數,整數。整數反轉是將所有數位對調;小數反轉是把整數部分的數反轉,再將小數部分的數反轉,不交換整數部分與小數部分;分數反轉是把分母的數反轉,再把分子的數反轉,不交換分子與分母;百分數的分子一定是整數,百分數只改變數字部分。整數新數也應滿足整數的常見形式,即除非給定的原數為零,否則反轉后得到的新數的最高位數字不應為零;小數新數的末尾不為0(除非小數部分除了0沒有別的數,那么只保留1個0);分數不約分,分子和分母都不是小數(約分滴童鞋抱歉了,不能過哦。輸入數據保證分母不為0),本次沒有負數。

輸入格式

一個數s

輸出格式

一個數,即s的反轉數

輸入輸出樣例

輸入 #1
5087462
輸出 #1
2647805
輸入 #2
600.084
輸出 #2
6.48
輸入 #3
700/27
輸出 #3
7/72
輸入 #4
8670%
輸出 #4
768%

STL!!!STL!!!STL!!!

  

	#include<iostream>
	#include<cstring>
	#include<algorithm>
	using namespace std;

	string reverse(string s){//反轉并且去除前導0
		int zerocnt = 0;
		reverse(s.begin(),s.end());

		for(auto i : s){
			if(i == 48) ++ zerocnt;
			else break;
		}
		s.erase(s.begin(),s.begin() + zerocnt);
		return (s == ""?"0":s);
	}

	string delTail(string s){//去除后導零
		int zeroCount = 0;
	    for (int i = s.size() - 1; i >= 0; --i)
	        if (s[i] == 48) ++zeroCount;
	        else break;//如果倒數遍歷數字不是零直接就彈出去避免多算
	    s.erase(s.end() - zeroCount, s.end());
	    return (s != "" ? s : "0");
	}

	int main(){
		string s;
		cin >> s;
		if(s.back() == '%'){
		 cout << reverse(s.substr(0,s.size() - 1)) <<'%'<< endl;
		 return 0;
		}

		for(auto i : s){
			if(i == '/'){
				cout << reverse(s.substr(0,s.find('/')))<< '/' << reverse(s.substr(s.find('/')+1));//分母不可能有前導零
					return 0;
			}
			if(i == '.'){
				cout << reverse(s.substr(0,s.find('.'))) << '.'<< delTail(reverse(s.substr(s.find('.')+1)));//小數點后邊有可能需要去除后導數零
				return 0;
			}
		}
		cout << reverse(s);
		return 0;
	}

  

posted @ 2019-10-12 10:03  香草味羊扒飯  閱讀(34)  評論(0編輯  收藏
立志刷完10000道題!!!
進度35/10000( がんばって)
七乐彩2011年走势图南方双彩