利用
解题思路
这是一道新手入门的题目
做法我们分情况讨论下
对于整数
去除前后的, 对于百分数
删去百分号后按照整数的套路即可, 对于分数
找到, /
并以他为界分割成两个字符串 分别去除前后的, 然后再合并, 对于小数
同上, 不过要将分隔符换成, .
然后输出即可
这样看起来
程序实现
根据上面的归纳
去除前后的
判断字符串是属于分数
还是小数, 又或者是百分数? ? 将字符串倒置
分割字符串
为了简单与优雅
字符串类型的判断
判断字符串的类型/
.
%
在源
string::npos
字符串的倒置
同样的reverse(起始迭代器,
迭代器怎么获取待反转
待反转
分割字符串
在其他的语言中
那就自己实现吧
在字符串类中待分割
首先利用
然后提取前半部分
接着提取后半部分
去 0?
这个就实在没有库函数可以利用了
当然
弄个循环
同理
注意
AC 代码
#include <bits/stdc++.h>//万能头文件
using namespace std;
string zero(string o)//辅助函数, 用于去除字符串前置的 0 与后置的 0
{
while (o[o.length()-1]=='0')//去后 0
o=o.substr(0,o.length()-1);
while (o[0]=='0')//去前 0
o=o.substr(1,o.length()-1);
return o==""?"0":o;//一个 fix, 避免全是 0 就给了个空字符串
}
int main()
{
string o;
cin >> o;
if (o.find(".")!=string::npos)//小数
{
string a=o.substr(0,o.find(".")),b=o.substr(o.find(".")+1,o.length()-o.find("."));
a=zero(a);
b=zero(b);
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
cout << a << "." << b;
}
else if (o.find("\%")!=string::npos)//百分数
{
string a=o.substr(0,o.find("\%"));
a=zero(a);
reverse(a.begin(),a.end());
cout << a << "\%";
}
else if (o.find("/")!=string::npos)//分数
{
string a=o.substr(0,o.find("/")),b=o.substr(o.find("/")+1,o.length()-o.find("/"));
a=zero(a);
b=zero(b);
reverse(a.begin(),a.end());
reverse(b.begin(),b.end());
cout << a << "/" << b;
}
else//啥都找不到, 自然是整数
{
o=zero(o);
reverse(o.begin(),o.end());
cout << o;
}
return 0;
}