洛谷-P1553 数字反转(升级版)

题目描述

给定一个数,请将该数各个位上数字反转得到一个新数。

这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为0(除非小数部分除了0没有别的数,那么只保留1个0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为0),本次没有负数。

输入格式

一个数s

输出格式

一个数,即s的反转数

输入输出样例

输入 #1

1
5087462

输出 #1

1
2647805

输入 #2

1
600.084

输出 #2

1
6.48

说明/提示

所有数据:25%s是整数,不大于20位

25%s是小数,整数部分和小数部分均不大于10位

25%s是分数,分子和分母均不大于10位

25%s是百分数,分子不大于19位

(20个数据)

题目大意及分析

本题要求你将一个数反转后输出,这个数可以是整数,分数,小数,百分数。需要注意的是反转之后整数部分前面的0需要省略。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<iostream>
#include<cstring>
#include<cstdio>

using namespace std;

int main()
{
string s;
s.resize(25);
scanf("%s",&s[0]);
char sign=NULL;
for(int i=0;i<s.size();i++)
{
unsigned long long ans=0,k=1; //题目中有说反转的数据不超过20位,所以需要用long long 类型;
while(s[i]>='0'&&s[i]<='9') //取出符号前面的数,用ans保存;
{
ans+=(s[i]-48)*k;
k*=10;
i++;
}
if(k!=1)
{
if(sign=='.')//判断是否为小数
{
while(ans%10==0)
{
if(ans==0)//如果小数点后全为零,保留一位后退出,否则会进入死循环;
{
break;
}
ans/=10;
}
}
printf("%lld",ans);
i--;
continue;
}
else
{
sign = s[i];
printf("%c",s[i]);
}
}
return 0;
}
-------------THE----END-------------

本文标题:洛谷-P1553 数字反转(升级版)

文章作者:Deng

发布时间:2019年08月08日 - 20:03

最后更新:2019年09月03日 - 20:44

原始链接:https://cydi.top/2019/08/08/P1553/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

觉得文章对您有帮助请我喝杯咖啡吧^_^
0%