题目背景
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为0(除非小数部分除了0没有别的数,那么只保留1个0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为0),本次没有负数。
题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。
整数反转是将所有数位对调。
小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。
分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。
百分数的分子一定是整数,百分数只改变数字部分。
输入格式
一个数 s
输出格式
一个数,即 s 的反转数
输入
5087462
输出
2647805
输入
600.084
输出
6.48
输入
700/27
输出
7/72
输入
8670%
输出
768%
#include<bits/stdc++.h>
using namespace std;
int main()
{
string a,b,c;
getline(cin,a);
int flag1=0,flag2=0,flag3=0,t,idx1,idx2,idx3;
int len=a.length();
long long sum=0,sum2=0;
for(int i=0;i<a.length();i++)
{
if(a[i]=='.')
{
flag1=1;
idx1=i;
break;
}
if(a[i]=='/')
{
flag2=1;
idx2=i;
break;
}
if(a[i]=='%')
{
flag3=1;
idx3=i;
break;
}
}
if(flag1==0&&flag2==0&&flag3==0)
{
reverse(a.begin(),a.end());
for(int i=0;i<a.length();i++)
{
t=a[i]-'0';
sum=sum*10+t;
}
cout<<sum;
}
if(flag1)
{
b=a.substr(0,idx1);
c=a.substr(idx1+1,len-idx1);
reverse(b.begin(),b.end());
reverse(c.begin(),c.end());
for(int i=0;i<b.length();i++)
{
t=b[i]-'0';
sum=sum*10+t;
}
for(int i=0;i<c.length();i++)
{
t=c[i]-'0';
sum2=sum2*10+t;
}
while(sum2%10==0&&sum2!=0)
sum2/=10;
cout<<sum<<"."<<sum2;
}
if(flag2)
{
b=a.substr(0,idx2);
c=a.substr(idx2+1,len-idx2);
reverse(b.begin(),b.end());
reverse(c.begin(),c.end());
for(int i=0;i<b.length();i++)
{
t=b[i]-'0';
sum=sum*10+t;
}
for(int i=0;i<c.length();i++)
{
t=c[i]-'0';
sum2=sum2*10+t;
}
cout<<sum<<"/"<<sum2;
}
if(flag3)
{
b=a.substr(0,idx3);
reverse(b.begin(),b.end());
for(int i=0;i<b.length();i++)
{
t=b[i]-'0';
sum=sum*10+t;
}
cout<<sum<<"%";
}
return 0;
}