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);
}
}