洛谷 P1553 數字反轉(升級版)
阿新 • • 發佈:2018-12-18
體會:字串處理著實是弱項啊,一兩個星期沒擼程式碼就手生了,蒟蒻一枚。
題解:
①整數和百分數好解決,而小數和分數就要分前部分和後部分(根據符號劃分)了。但是不管是哪一種,翻轉之後的前置零是都要去掉的。
②第一步出來完後,直接判斷字串中存在‘%’或者不存在符號,換行一下,整數和百分數就解決了。
③接下來處理小數和分數。因為這兩種前部分是不存在翻轉之後的後置零的,所以在第一步完成後就可以不用管前部分了。但是後部分比較特殊,前置零和後置零都要去掉。所以鄙人這是用了"兩頭縮"的方法。
④最重要的一點是全是零的情況,尤其小數,0.0,還是要輸出零的。
程式碼:
#include<iostream> #include<cstdio> #include<cmath> #include<string> #include<cstdlib> #include<cstring> #include<algorithm> using namespace std; const int INF = 0x3f3f3f3f; const int MAXN = 1e6; char s[25]; int main(){ int p,i,len; char ch; cin >> s; len = strlen(s); ch = 0; p = len; for(i = 0; i < len;++i){ if(s[i] < '0' || s[i] > '9'){ p = i; ch = s[i]; break; } } i = p - 1; while(s[i] == '0' && i > 0) --i; //消除前半部分數的翻轉後前導零 for(;i >= 0; --i) cout << s[i]; if(ch == 0) cout << endl; else if(ch == '%') cout << ch << endl; else{ cout << ch; int l = p+1,r = len-1; while(s[l]== '0' && l < r) l++; //消除後半部分數的翻轉後前導零 while(s[r]== '0' && r > l) r--; //消除後半部分數的翻轉後後置零 for(i = r; i >= l; --i) cout << s[i] ; cout << endl; } return 0; }