题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。
- 整数反转是将所有数位对调。
- 小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。
- 分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。
- 百分数的分子一定是整数,百分数只改变数字部分。
- 数据没有负数。
分析
这道题具体实现并不难,但是有点坑。
首先写出大体框架:
string a;
void t1(),t2(),t3(),t4();
int main() {
cin >> a;
if (a[a.length()-1]=='%') t3();//百分数
for (auto k : a) {
if (k == '.') t1();//小数
else if (k == '/') t2();//分数
}
t4();//整数
return 0;
}
接下来依次实现各部分。
- 整数比较简单。首先将字符串转化为整数,利用模运算倒序得到每一位数字即可。
但这里要注意数据范围:
-
对于 \(25\%\) 的数据,\(s\) 是整数,不大于 \(20\) 位;
所以 记得开\(\textup{unsigned}\) \(\textup{long}\) \(\textup{long}\)。
-
百分数实质上就是整数后多输出了一个百分号,同上。
-
小数可以利用sscanf()从字符串中分别读出整数部分和小数部分,分别处理即可。
-
分数只不过是把小数的小数点换成了分数线,同上。
代码
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;
string a;
void t1(),t2(),t3(),t4();
int main() {
cin >> a;
if (a[a.length()-1]=='%') t3();//百分数
for (auto k : a) {
if (k == '.') t1();//小数
else if (k == '/') t2();//分数
}
t4();//整数
return 0;
}
void t1() {
unsigned long long t=0, c=0, k=0, g=0;
sscanf(a.c_str(), "%llu.%llu", &t, &c);
while (t) {
k = k*10+t%10;
t/=10;
}
while (c) {
g = g*10+c%10;
c/=10;
}
cout << k<< '.' << g;
exit(0);
}
void t2() {
unsigned long long t=0, c=0, k=0, g=0;
sscanf(a.c_str(), "%llu/%llu", &t, &c);
while (t) {
k = k*10+t%10;
t/=10;
}
while (c) {
g = g*10+c%10;
c/=10;
}
cout << k<< '/' << g;
exit(0);
}
void t3() {
unsigned long long t=0, c=0;
for (unsigned long long i=0; i<a.length()-1; i++) {
t = t*10+(a[i]-'0');
};
while (t) {
c = c*10+t%10;
t/=10;
}
cout << c << '%';
exit(0);
}
void t4() {
unsigned long long t=0, c=0;
for (unsigned long long i=0; i<a.length(); i++) {
t = t*10+(a[i]-'0');
}
while (t) {
c = c*10+t%10;
t/=10;
}
cout << c;
exit(0);
}
标签:10,洛谷,百分数,反转,整数,t1,P1553,升级版,小数
From: https://www.cnblogs.com/sleepboth/p/17608010.html