数字反转(升级版)(Java题解)
题目背景
以下为原题面,仅供参考:
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为 0 0 0(除非小数部分除了 0 0 0 没有别的数,那么只保留1个 0 0 0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为 0 0 0),本次没有负数。
题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。
-
整数反转是将所有数位对调。
-
小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。
-
分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。
-
百分数的分子一定是整数,百分数只改变数字部分。
的反转数
import java.util.Scanner;
/**
* 数字反转,输出看0
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
if (str.contains(".")) {
//切割、小数部分除了0没有别的数,那么只保留1个0,否则不保留末尾的0
String[] split = str.split("[.]");
String a = inverse(split[0].toCharArray());
String b = inverse(split[1].toCharArray());
//插板子,第一位不插,插了第一次,如果下一位不是0,break;
int index = -1;
for (int i = b.length() - 1; i >= 1 ; i--) {
if (b.charAt(i) == '0'){
index = i;
if (b.charAt(i-1) != '0'){
break;
}
}
}
if (index != -1){
b = b.substring(0, index);
}
String res = a + "." + b;
System.out.println(res);
} else if (str.contains("/")) {
//切割
String[] split = str.split("[/]");
String a = inverse(split[0].toCharArray());
String b = inverse(split[1].toCharArray());
System.out.println(a + "/" + b);
} else if (str.contains("%")) {
//截取
char[] chs = str.substring(0,str.length() - 1).toCharArray();
System.out.println(inverse(chs) + "%");
} else {
char[] chs = str.toCharArray();
System.out.println(inverse(chs));
}
}
//反转数字
public static String inverse(char[] chs){
for (int i = 0,j = chs.length - 1; i < j ; i++,j--) {
char ch = chs[i];
chs[i] = chs[j];
chs[j] = ch;
}
//转为数字 --> 最大20位,超出long 2^64精度
BigInteger m = BigInteger.valueOf(1);
BigInteger a = BigInteger.valueOf(0);
BigInteger x;
BigInteger s = BigInteger.valueOf(10);
for (int i = chs.length - 1; i >= 0; i--) {
x = BigInteger.valueOf(chs[i] - '0');
a = a.add(x.multiply(m));
m = m.multiply(s);
}
return "" + a;
}
}