洛谷 P1553 数字反转(升级版) 题解 (字符串C/C++)

  • 主要就是两种处理方法,整数部分和小数部分,分数和百分数都可归结为整数部分
    • 整数部分从后往前找找到第一个不为0的地方i,然后将子串 0~i 转置
    • 小数部分从前往后找找到第一个不为0的地方j,然后将子串转置
    • 具体请看代码和注释
//#define LOCAL
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <cctype>
#define inf 0x3f3f3f3f
#define eps 1e-6
using namespace std;
#define clr(x) memset(x,0,sizeof((x)))
const int maxn = 1e4+1;//2e6+1
#define MAX(a,b,c) ((a)>(b)?((a)>(c)?(a):(c)):((b)>(c)?(b):(c)))
#define _max(a,b) ((a) > (b) ? (a) : (b))
#define _min(a,b) ((a) < (b) ? (a) : (b))
#define _for(a,b,c) for(int a = b;a<c;a++)

string s;
void rev(string str) {
    
    
	int len = str.length();
	if(str=="0"){
    
    cout<<str;return ;}
	int i = 0;
	for(i = len-1;i>=0;i--) {
    
    
		if(str[i]!='0')break;
	}
	for(int j = i;j>=0;j--) {
    
    
		cout<<str[j];
	}
}
int main()
{
    
    
#ifdef LOCAL 
	freopen("data.in","r",stdin);
	freopen("data.out","w",stdout);
#endif
	cin>>s;
	int len = s.length();
	int i;
	for(i = 0;i<len;i++) {
    
    
		if(s[i]=='.'||s[i]=='/'||s[i]=='%')break;
	}
	string tmp;
	for(int j = 0;j<i;j++) {
    
    
		tmp+=s[j];
	}
	//cout<<tmp;
	rev(tmp);
	if(i<len)
		cout<<s[i];
	tmp = "";//清空

	//小数部分要特殊处理
	if(s[i]=='.'&&i+2<len) {
    
    //小数只有一位时不需要特殊处理
		int k;
		for(k = i+1;k<len;k++) {
    
    //找小数点后面第一个不为0的位置
			if(s[k]!='0')break;
		}
		for(int j = k;j<len;j++) {
    
    
			tmp += s[j];
		}
	}
	else {
    
    
		for(int k = i+1;k<len;k++) {
    
    
			tmp += s[k];
		}
	}
	rev(tmp);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Jason__Jie/article/details/112760190
今日推荐