P1553 数字反转(升级版)java版

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38409944/article/details/83745298

题目来自:https://www.luogu.org/problemnew/show/P1553

题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。

这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为0(除非小数部分除了0没有别的数,那么只保留1个0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为0),本次没有负数。

输入输出格式
输入格式:
一个数s

输出格式:
一个数,即s的反转数

输入输出样例
输入样例#1: 
5087462
输出样例#1: 
2647805
输入样例#2: 
600.084
输出样例#2: 
6.48
输入样例#3: 
700/27
输出样例#3: 
7/72
输入样例#4: 
8670%
输出样例#4: 
768%

说明
所有数据:25%s是整数,不大于20位
25%s是小数,整数部分和小数部分均不大于10位
25%s是分数,分子和分母均不大于10位
25%s是百分数,分子不大于19位
(20个数据)


思路:
这是一道处理字符串的题目。乍一看题目细节好多啊,而且也很繁琐。
是的我也是一开始每一种方法考虑过去,结果写出来的代码又臭又长。
还特地下载了测试数据,有几组比较特别的:0000/3,0002。
来分析一下:
字符串反转,我分两部分,一部分是.或者/或者%前,一部分是后,这里用字符串分割。
然后输出前部分的反转,再输出符号,再输出后一部分的反转。一开始我将反转的字符串分两种情况考虑,一个是小数点前,一个是小数点后。
反转的部分我也给抽离封装到一个函数中,经过观察,小数点前后都是通用的。
首先要考虑几组比较特别的字符串:0000 ,001,100,010。
结果发现不管是小数位后面的反转还是小数位前面的反转结果都是一样的。
就比如001,整数反转后是1,小数位反转后也是1,会忽略掉前面的0
再比如100,整数翻转后是1,小数位不存在这个数,所有也忽略掉后面的0.
因此反转的时候我们首先要把前后的0都给忽略掉。
直接撸代码:

import java.util.*;

public class Main {
    public static void main(String args[]) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        String[] strL = new String[2];
        int flag;
        String symbol;
        if(str.indexOf(".")!=-1){
            symbol = ".";
        }else if(str.indexOf("/")!=-1){
            symbol = "/";
        }else if(str.indexOf("%")!=-1){
            symbol = "%";
        }else{
            symbol=null;
        }
        if(symbol==null){
            front_int(str);
        }else if(symbol=="%"){
            front_int(str.substring(0,str.length()-1));
            System.out.print("%");
        }else if(symbol=="/"){
            strL = str.split("/");
            front_int(strL[0]);
            System.out.print("/");
            front_int(strL[1]);
        }else{
            strL = str.split("\\.");
            front_int(strL[0]);
            System.out.print(".");
            front_int(strL[1]);
        }
        return;
    }
    public static void front_int(String str){
        int flag=0,key_front=-1,key_back=-1;
        for(int i=0;i<str.length();i++){
            if(str.charAt(i)!='0'){
                key_front=i;
                break;
            }
        }
        for(int i=str.length()-1;i>=0;i--){
            if(str.charAt(i)!='0'){
                key_back=i;
                break;
            }
        }
        if(key_front==-1){
            System.out.print("0");
            return;
        }
        for(int i=key_back;i>=key_front;i--){
            System.out.print(str.charAt(i));
        }
        return;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38409944/article/details/83745298
今日推荐