洛谷 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; }
接下来依次实现各部分。
- 整数比较简单。首先将字符串转化为整数,利用模运算倒序得到每一位数字即可。
但这里要注意数据范围:
-
对于
的数据, 是整数,不大于 位;所以 记得开
。
-
百分数实质上就是整数后多输出了一个百分号,同上。
-
小数可以利用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); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理