一、题目部分
题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。
整数反转是将所有数位对调。
小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。
分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。
百分数的分子一定是整数,百分数只改变数字部分。
输入格式
一个数 s
输出格式
一个数,即 s 的反转数
输入输出样例
输入 #1
5087462
输出 #1
2647805
输入 #2
600.084
输出 #2
6.48
输入 #3
700/27
输出 #3
7/72
输入 #4
8670%
输出 #4
768%
二、解题过程
思路
(见代码 分不同情况判断和进行数字反转即可)
提交AC答案
#include<bits/stdc++.h>
using namespace std;
int t1,t2,t3,t4,t11,t12,t21,t22,t23,t31;
string a,str;
int main()
{
cin>>a;
for(int i=a.length()-1;i>=0;i--)
{
if(a[i]=='.')
{
t1=i;
break;
}
else if(a[i]=='/')
{
t2=i;
break;
}
else if(a[i]=='%')
{
t3=i;
break;
}
}
if(t1==0&&t2==0&&t3==0)
{
for(int i=a.length()-1;i>=0;i--)
{
if(a[i]!='0')
{
t4=i;
break;
}
}
for(int i=t4;i>=0;i--)
cout<<a[i];
}
else if(t1!=0)
{
for(int i=t1-1;i>=0;i--)
{
if(a[i]!='0')
{
t11=i;
break;
}
}
for(int i=t11;i>=0;i--)
str+=a[i];
str+='.';
for(int i=t1+1;i<a.length();i++)
{
if(a[i]!='0'||(a[i]=='0'&&i==a.length()-1))
{
t12=i;
break;
}
}
for(int i=a.length()-1;i>=t12;i--)
str+=a[i];
cout<<str;
}
else if(t2!=0)
{
if(a[a.length()-1]=='0'&&a[a.length()-2]=='/')
cout<<0;
else
{
for(int i=t2-1;i>=0;i--)
{
if(a[i]!='0')
{
t21=i;
break;
}
}
for(int i=t21;i>=0;i--)
str+=a[i];
str+='/';
for(int i=t2+1;i<a.length();i++)
{
if(a[i]!='0')
{
t22=i;
break;
}
}
for(int i=a.length()-1;i>=t2+1;i--)
{
if(a[i]!='0')
{
t23=i;
break;
}
}
for(int i=t23;i>=t22;i--)
str+=a[i];
cout<<str;
}
}
else if(t3!=0)
{
for(int i=t3-1;i>=0;i--)
{
if(a[i]!='0')
{
t31=i;
break;
}
}
for(int i=t31;i>=0;i--)
str+=a[i];
str+='%';
cout<<str;
}
// printf("%d %d %d %d",t1,t2,t3,t4);
return 0;
}