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

题目描述

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

  • 整数反转是将所有数位对调。
  • 小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。
  • 分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。
  • 百分数的分子一定是整数,百分数只改变数字部分。
  • 数据没有负数。

分析

这道题具体实现并不难,但是有点坑。
首先写出大体框架:

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;
}

接下来依次实现各部分。

  1. 整数比较简单。首先将字符串转化为整数,利用模运算倒序得到每一位数字即可。
    但这里要注意数据范围:
  • 对于 25% 的数据,s 是整数,不大于 20

    所以 记得开unsigned long long

  1. 百分数实质上就是整数后多输出了一个百分号,同上。

  2. 小数可以利用sscanf()从字符串中分别读出整数部分和小数部分,分别处理即可。

  3. 分数只不过是把小数的小数点换成了分数线,同上。

代码

#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);
}
posted @   sleepwind  阅读(156)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示