https://www.luogu.com.cn/problem/P1553
这题主要就是要学会使用字符串的一些操作,比如find(),还有用到algorithm库的reverse函数进行反转比较方便。稍微难一点的地方我觉得就在于有几个比较刁钻的测试点不好找,因为刷题少所以没有注意到,还得多谢袁老师,比如 0 , 0.0 , 0/1 , 0% 这几个点。
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
void inter(string a);//整数反转
void decimal(string a); //小数反转
void fraction(string a);//分数反转
void percent(string a);//百分数反转
int main()
{
string num;
cin >> num;
if(num.length() == 1) {
cout<<num;
return 0;
}
if(num.find('.') != string::npos)
{
decimal(num);
}
else if(num.find('/') != string::npos)
{
fraction(num);
}else if(num.find('%') != string::npos)
{
percent(num);
}else{
inter(num);
}
return 0;
}
void inter(string a)
{
long long i;
reverse(a.begin(),a.end());
for(i=0; a[i] == '0' && i<a.length(); i++);
for(int j=i; j<a.length(); j++)
cout<<a[j];
}
void decimal(string a)
{
int k,i,j;
string s1,s2;
k=a.find('.');
reverse(a.begin(),a.begin()+k);
reverse(a.begin()+k+1,a.end());
//输出小数点前部分
for(i=0; a[i] == '0' && i<a.length() ;i++);
if(a[i] == '.') cout<<'0'; //处理小数点前面为0的情况
for(j=i; j<k+1; j++)
cout<<a[j];
//输出小数点后部分
for(i=a.length()-1; a[i] == '0' && i>k+1; i--);
for(j=k+1; j<i+1; j++)
cout<<a[j];
}
//跟小数的处理方法类似
void fraction(string a)
{
long long k,i,j;
string s1,s2;
k=a.find('/');
reverse(a.begin(),a.begin()+k);
reverse(a.begin()+k+1,a.end());
for(i=0; a[i] == '0' && i<a.length() ;i++);
if(a[i] == '/') cout<<'0'; //处理0/1这种分子为0的情况
for(j=i; j<k+1; j++)
cout<<a[j];
for(i=k+1; a[i] == '0' && i<a.length() ;i++);
for(j=i; j<a.length(); j++)
cout<<a[j];
}
void percent(string a)
{
long long i;
reverse( a.begin(),a.end()-1 );
for(i=0; a[i] == '0' && i<a.length(); i++);
if(a[i] == '%') cout<<'0';
for(int j=i; j<a.length(); j++)
cout<<a[j];
}