若不会,请朝这看
查看原帖
若不会,请朝这看
993760
gkhf楼主2025/7/28 15:56

我发现这个题目还有很多人不会,所以我想把我的代码贴出来帮助大家(有注释,建议大家不要直接抄袭,理解为主)程序行数较多,建议耐心看完

程序主要分为三部分:
1.判断是否有符号
2.无符号反转数字
3.有符号反转数字

题目描述

这个数可以是小数,分数,百分数,整数。
整数反转是将所有数位对调。
小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。
分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。
百分数的分子一定是整数,百分数只改变数字部分

细节

1.没有负数 2.小数,分数与其他数不同 3.分数不约分4.百分数的%不换位置5.注意0的处理(若有其他未注意的事项,请看程序注释)

若这个帖子帮助了你,可以给gkhf(帖主)一个关注吗谢谢(不喜勿喷)

#include <bits/stdc++.h>
using namespace std;
int cnt;
int ans;
string a;
bool p=false;
bool px(){//判断是否有符号
	for(int i=0;i<a.length();i++){
		if(a[i]<'0'||a[i]>'9'){
			return true;
		}
	}
	return false;
}
int main(){
	cin>>a;
	if(px()==false){
		for(int i=a.length()-1;i>=0;i--){//整数 
			if(p==false&&a[i]=='0'){//只要最高位出现了其他的数字
				continue;//p==false就不成立了
			}//因为输出其他数字的时候将p=true了
			else{//后面的判断最高位是0也是一样
				cout<<a[i];
				p=true;
			}
		}
		if(p==false){//对0的特殊处理:因为如果整数只输入了0
			cout<<0;//而0反转还是0但是它也在最高位不让输出了
		}//所以可以直接输出,后面的特殊处理也是一样
	}
	else if(px()==true){
		for(int i=0;i<a.length();i++){
			if(a[i]<'0'||a[i]>'9'){
				if(a[i]=='.'){//小数 
					cnt=1;
					ans=i;//因为小数点,和分数线的位置不确定
					break;//所以用ans来记录下标
				}		
				if(a[i]=='%'){//百分数
					cnt=2;
					break;//但是百分号,一直在最后就不用记录位置
				}
				if(a[i]=='/'){ //分数
					cnt=3;
					ans=i;
					break;
				}
				
			}
		}
		if(cnt==1){
			p=false;//小数处理
			for(int i=ans-1;i>=0;i--){
				if(a[i]=='0'&&p==false){ 
					continue;
				}//小数的整数部分
				else{
					cout<<a[i];
					p=true;
				}
			}
			if(p==false){
				cout<<0;//0的特殊处理
			}
			p=false;
			cout<<'.';
			string h="";
			for(int i=ans+1;i<a.length();i++){
				if(a[i]=='0'&&p==false){
					continue;
				}
				else{//小数的小数部分
					h+=a[i];//前面是0的地方先排除掉
					p=true; //出现其他数字就不用在判断了
				}
			}
			for(int i=h.length()-1;i>=0;i--){
				cout<<h[i];//在输出
			}
			if(p==false){
				cout<<0;//0的特殊判断
			}
		}
		if(cnt==2){
			p=false;
			for(int i=a.length()-1;i>=0;i--){
				if(a[i]=='0'&&p==false){
					continue;
				}
				else if(a[i]!='%'){//百分数跟整数就差了个符号就不说了
					cout<<a[i];
					p=true;
				}
			}
			if(p==false){
				cout<<0;
			}
			cout<<'%';
			p=false;
		}
		if(cnt==3){
			p=false;
			for(int i=ans-1;i>=0;i--){
				if(a[i]=='0'&&p==false){
					continue;
				}
				else{
					cout<<a[i];
					p=true;
				}
			}
			if(p==false){
				cout<<0;//分数相当于符号把整串数字分为两个整数
			}//也差不多
			cout<<'/';
			p=false;
			for(int i=a.length()-1;i>=ans+1;i--){
				if(a[i]=='0'&&p==false){
					continue;
				}
				else{
					cout<<a[i];
					p=true;
				}
			}if(p==false){
				cout<<0;
			}
			p=false;
		}
	}
	return 0;
}

2025/7/28 15:56
加载中...