题解 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<<"%";
}
五个程序分着做,比较简单。