1. 程式人生 > >【題解】洛谷1553 數字反轉(…

【題解】洛谷1553 數字反轉(…

題目描述

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

輸入輸出格式

輸入格式:

一個數s

輸出格式:

一個數,即s的反轉數

輸入輸出樣例

輸入樣例#1:
①
5087462
②
600.084
③
700/27
④
8670%
輸出樣例#1:
①
2647805
②
6.48
③
7/72
④
768%

說明

所有資料:25%s是整數,不大於20位
          25%s是小數,整數部分和小數部分均不大於10位
          25%s是分數,分子和分母均不大於10位
          25%s是百分數,分子不大於19位
          (20個數據) 解析 這道題費了不少功夫,反映出我對字串的嚴重不熟悉和題量太少,不過做完收穫很大。 首先寫出一個反轉子程式用於呼叫,注意一旦清空的話也要保留一個‘0’; 然後就是主程式了,用幾重判斷來決定反轉模式,在這裡我學到了一個“string::npos"的常量,我所理解的意義為所查詢的字元位置不存在,值為-1,如 (p=s.find('.'))!=string::npos) 就是將字串s中‘.'的位置賦值給p,然後判斷是否有‘.',若沒有則該表示式值為false. 還學到了幾個string函式 1.s.empty()意為判斷s是否為空,若空則值為true; 2.s.replace(int a,int b,string m
)意為將s中從a位置開始長度為b位的字串替換為m; 3.s.erase(int a,int b)意為將s中從a位置開始長度為b位的字串搽除; 其他沒什麼了,附AC程式碼 #include #include #include using namespace std; string s; int p; void fanz(string &a,int x,int y) {int l=y-x+1;  string b="";  while(a[y]=='0')y--;    while(y-x+1)b+=a[y--];    if(b.empty())b="0";    a.replace(x,l,b); } int main() {cin>>s;  if ((p=s.find('.'))!=string::npos)   {fanz(s,0,p-1);    fanz(s,s.find('.')+1,s.size()-1);    while(s[s.size()-1]=='0'&&s.find('.')+1    s=s.erase(s.size()-1,1);   }   else if((p=s.find('/'))!=string::npos)    {fanz(s,0,p-1);    fanz(s,s.find('/')+1,s.size()-1);    }    else if((p=s.find('%'))!=string::npos)     fanz(s,0,s.size()-2);     else fanz(s,0,s.size()-1);   cout<<s;   return 0; }