题解 P1553 【数字反转(升级版)】

· · 题解

题解:

嗯,这题是有些麻烦。分成几个子程序就行,而且还能互相调用。

主程序:

```cpp

int main() { cin>>s; b=find(s); if (b==0) integer(s); if (b==1) decimals(s); if (b==2) fraction(s); if (b==3) percentage(s); return 0; }

子程序1:

    ```cpp

int find(string S)
{
    for (int i=0;i<=S.size()-1;i++)
        {
         if (S[i]=='.')
            {a=i;return 1;}    {是小数返回1}
         if (S[i]=='/')
            {a=i;return 2;}    {是分数返回2}
         if (S[i]=='%')
            {a=i;return 3;}    {是百分数返回3}
        }
    return 0;    {是整数返回0}
}

子程序2:

```cpp

void integer(string S) {整数程序,正常人看得懂的} { for (int i=S.size()-1;i>=1;i--) if (S[i]=='0') S=S.erase(i,1); else break; for (int i=S.size()-1;i>=0;i--) cout<<S[i]; }

子程序3:

    ```cpp

void decimals(string S)    {小数程序,是四种可能中最难的}
{
     n=S.substr(0,a);    {小数点前整数部分}
     m=S.substr(a+1,S.size()-(a+1));    {小数点后小数部分}
     //cout<<n<<endl<<m<<endl;
     integer(n);    {整数部分用整数处理}
     cout<<".";
     int i=0;
     while (m!="")
           {
            if (m[i]=='0')
               m=m.erase(0,1);
            else 
               break;
           }
     if (m=="")
        m="0";
     for (i=m.size()-1;i>=0;i--)
         cout<<m[i];
}

子程序4:

```cpp

void fraction(string S) {分数程序} { n=S.substr(0,a); {同小数,分数线前分子} m=S.substr(a+1,S.size()-(a+1)); {分数线后分母} //cout<<n<<endl<<m<<endl; integer(n); {分子调用整数程序} cout<<"/"; integer(m); {分母调用整数程序} }

子程序5:

    ```cpp

void percentage(string S)    {百分数程序}
{
     S=S.erase(S.size()-1,1);    {调用整数程序前先去百分号}
     integer(S);    {数字调用整数程序}
     cout<<"%";
}

五个程序分着做,比较简单。