洛谷——P1553数字的反转

https://www.luogu.com.cn/problem/P1553
坑点:
1.整数为0,分母为0,百分数为0,小数的前半部分为0,后半部分为0
2.小数的后半部分,可能存在前导0,反转后,要消去后导0,(我的做法是先消去前导零,再去反转,就不怕有这个问题了)
代码:

import java.util.Scanner;

public class Main {
	public static boolean judge(String a)//判断函数,传进来一个字符串,判断该字符串是是全部都由 0 组成
	{
		int count=0;
		char c;
		for(int i=0;i<a.length();++i)
		{
			c=a.charAt(i);
			if(c=='0')
				++count;
		}
		if(count==a.length())
			return true;
		else
		return false;
	}
	public static void main(String[] args) {
		Scanner reader = new Scanner(System.in);
		Solution_11 per=new Solution_11();
		while(reader.hasNext()) 
		{
		String num = reader.next();// 接收一个数
		char c;
		int n = 0;
		int index = -1;//如果不是整数,那么其他三种数的符号的下标要记录下来,得用到
		
		/*判断输入的数的类型,n=0,整数;n=1,小数;n=2,百分数,n=3,除数*/
		for (int i = 0; i < num.length(); ++i)
		{
			c = num.charAt(i);
			if(c=='.'){n = 1;index = i;}
			if(c=='%'){n = 2;index = i;}
			if(c=='/'){n = 3;index = i;}
		}
		if(n==0)//整数
			{
			String result=per.solove(num);
			if(judge(num))
			{
				result="0";
			}
			System.out.println(result);
			}
		if(n==1)//小数
			{
			String a=num.substring(0,index);
			if(judge(a))
				a="0";
			else
				a=per.solove(a);
			String b=num.substring(index+1,num.length());
			if(judge(b))
				b="0";
			//小数部分,可能有前导0,先消去,免得反转变成后导0
			else
			{
			int count=0;
			int t=b.length();
			for(int i=0;i<t;++i)//消除前导零
			{
				c=b.charAt(i);
				if(c=='0')
					++count;//计算前导零的个数
				else
					break;
			}
			b=b.substring(count, t);//消去原有前导零
			b=per.solove(b);
			}
			System.out.println(a+"."+b);
			}
		if(n==2)//百分数
		{
			num=num.substring(0,num.length()-1);
			if(judge(num))
				num="0";
			else
				num=per.solove(num);
			System.out.println(num+"%");
		}
		if(n==3)//分数
		{
			String a=num.substring(0,index);
			if(judge(a))
				a="0";
			else
				a=per.solove(a);
			String b=num.substring(index+1,num.length());
			b=per.solove(b);
			System.out.println(a+"/"+b);
			
		}
		
		}//这个大括号是while循环的
	}
}

//截取类,传入一个数字字符串,返回一个反转并消除前导零后的字符串,整数可能反转后出现前导零,百分数等这些都可能出现,作为一个共性提出来,不过,这部分代码还是提出来不够完全,上面还有很多地方可以提取出来的。
class Solution_11 {
	public String solove(String num) {
		char c;
		StringBuffer b = new StringBuffer(num);
		num = b.reverse().toString();// 将该整数反转过来
		int t=num.length();//数字长度
		int count=0;
		for(int i=0;i<t;++i)// 消除前导零
		{
			c=num.charAt(i);
			if(c=='0')
				++count;//计算前导零的个数
			else
				break;
		}
		return num.substring(count,t);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值