专栏文章

题解:P1553 数字反转(升级版)

P1553题解参与者 7已保存评论 7

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
7 条
当前快照
1 份
快照标识符
@mioas845
此快照首次捕获于
2025/12/02 16:09
3 个月前
此快照最后确认于
2025/12/02 16:09
3 个月前
查看原文

题解:P1553 数字反转(升级版)

思路

根据题面,可以看出一共有四种情况,分别是:
  • 整数:只需反转之后在判断前导零。
  • 小数:整数部分反转判断前导零,小数部分比较特殊,是反转之后,判断后面有没有零。
  • 分数:分子部分反转判断前导零,分母部分反转判断前导零。
  • 百分数:直接将分子部分反转判断前导零便可。
注:要特判 000.n0.nn.0n.00/n0/n00 的情况。(真的卡了我很久)。

AC Code

CPP
#include<bits/stdc++.h>
using namespace std;
char w='Q'; //一开始是整数
string a; 
int y;

int main(){
	cin>>a;
	
	for(int i=0;i<a.size();i++){
		if(a[i]=='.'){ //是小数
			w='X';
		}
		if(a[i]=='/'){ //是分数
			w='C';
		}
		if(a[i]=='%'){ //是百分数
			w='V';
		}
	}
	if(w=='Q'){
		if(a=="0"){ //特判0
			cout<<0;
			return 0;
		}
		int len=a.size()-1;
		while(a[len]=='0') len--; //前导零
		for(int i=len;i>=0;i--){
			cout<<a[i];
		}	
	}
	
	if(w=='X'){
		int j=0;
		while(a[j]!='.'){
			y++;
			j++;
		}
		int len=y-1;
		while(a[len]=='0') len--; //前导零
		if(len==-1) cout<<0; //特判整数部分是否为零
		for(int i=len;i>=0;i--){
			cout<<a[i];
		}
		cout<<".";
		len=y+1;
		while(a[len]=='0') len++; //后面的零
		if(len==a.size()) cout<<0; //特判小数部分是否为零
		for(int i=a.size()-1;i>=len;i--){
			cout<<a[i];
			}
	}
	if(w=='C'){
		int j=0;
		while(a[j]!='/'){
			y++;
			j++; 
		}
		int len=y-1;
		while(a[len]=='0') len--; //前导零
		if(len==-1) cout<<0; //特判分子数部分是否为零
		for(int i=len;i>=0;i--){
			cout<<a[i];
		}
		cout<<"/";
		len=a.size()-1;
		while(a[len]=='0') len--; //前导零
		for(int i=len;i>=y+1;i--){
			cout<<a[i];
		}
	}
	if(w=='V'){
		if(a=="0%"){ //特判
			cout<<0<<'%';
			return 0;
		}
		int len=a.size()-2;
		while(a[len]=='0') len--; //前导零
		for(int i=len;i>=0;i--){
			cout<<a[i];
			}
		cout<<"%";
	}
	return 0;
}

评论

7 条评论,欢迎与作者交流。

正在加载评论...