题目背景
以下为原题面,仅供参考:
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。整数反转是将所有数位对调;小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分;分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母;百分数的分子一定是整数,百分数只改变数字部分。整数新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零;小数新数的末尾不为 0 0 0(除非小数部分除了 0 0 0 没有别的数,那么只保留1个 0 0 0);分数不约分,分子和分母都不是小数(约分滴童鞋抱歉了,不能过哦。输入数据保证分母不为 0 0 0),本次没有负数。
题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与 NOIp2011 普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。
-
整数反转是将所有数位对调。
-
小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。
-
分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。
-
百分数的分子一定是整数,百分数只改变数字部分。
输入格式
一个实数 s s s
输出格式
一个实数,即 s s s 的反转数
样例 #1
样例输入 #1
5087462
样例输出 #1
2647805
样例 #2
样例输入 #2
600.084
样例输出 #2
6.48
样例 #3
样例输入 #3
700/27
样例输出 #3
7/72
样例 #4
样例输入 #4
8670%
样例输出 #4
768%
提示
【数据范围】
- 对于 25 % 25\% 25% 的数据, s s s 是整数,不大于 20 20 20 位;
- 对于 25 % 25\% 25% 的数据, s s s 是小数,整数部分和小数部分均不大于 10 10 10 位;
- 对于 25 % 25\% 25% 的数据, s s s 是分数,分子和分母均不大于 10 10 10 位;
- 对于 25 % 25\% 25% 的数据, s s s 是百分数,分子不大于 19 19 19 位。
【数据保证】
-
对于整数翻转而言,整数原数和整数新数满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数和原来的数字的最高位数字不应为零。
-
对于小数翻转而言,其小数点前面部分同上,小数点后面部分的形式,保证满足小数的常见形式,也就是末尾没有多余的 0 0 0(小数部分除了 0 0 0 没有别的数,那么只保留 1 1 1 个 0 0 0。若反转之后末尾数字出现 0 0 0,请省略多余的 0 0 0)
-
对于分数翻转而言,分数不约分,分子和分母都不是小数。输入的分母不为 0 0 0。与整数翻转相关规定见上。
-
对于百分数翻转而言,见与整数翻转相关内容。
数据不存在负数。
1.题目分析
输入整数,小数,分数,百分数,
整数直接反转,反转后前置有零的要去除。
小数单独反转整数和小数部分,反转后小数部分要去后置零,整数部分要去前置零。
分数单独反转分子分母部分,分子分母都要去除前置零。
百分数符号位不动,反转整数部分,反转后去除前置零。
值得注意的是,为零的情况要考虑清楚,整数可以为0,小数可以为0.0,但分数只能是分子为0,百分数也可以为0%。
2.题目思路
这里使用的是JAVA,输入字符串,判断包含的符号位:
如果包含小数点,将字符以小数点为分隔符切割成一个字符串数组,去除小数部分前置零,去除整数部分后置零,将字符串数组内的字符串转成StringBuilder类型,调用反转函数,判断整数或者小数部分只有零的情况,打印即可。
如果包含的是分数符号,一样切割成数组,去除分子分母部分后置零,使用反转函数,需要判断分子为零的情况。
如果包含的是百分号,切割成数组,去除后导零,数字反转后,判断百分数为零的情况。文章来源:https://www.toymoban.com/news/detail-647394.html
其他就是整数,直接去除后导零,反转打印即可,判断为零的情况。文章来源地址https://www.toymoban.com/news/detail-647394.html
3.代码实现
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
if (str.contains(".")) {
String[] xs = str.split("\\.");
//去除小数部分前置零
xs[1] = xs[1].replaceFirst("^0+", "");
//去除整数部分后置零
xs[0] = xs[0].replaceAll("0+$", "");
StringBuilder sb1 = new StringBuilder(xs[0]);
StringBuilder sb2 = new StringBuilder(xs[1]);
//数字反转
sb1.reverse();
sb2.reverse();
//整数或者小数部分只有零的情况
if (sb2.length() == 0) {
sb2.append("0");
}
if (sb1.length() == 0) {
sb1.append("0");
}
System.out.println(sb1 + "." + sb2);
} else if (str.contains("/")) {
String[] fs = str.split("/");
//去除分子分母部分后置零
fs[0] = fs[0].replaceAll("0+$", "");
fs[1] = fs[1].replaceAll("0+$", "");
StringBuilder sb1 = new StringBuilder(fs[0]);
StringBuilder sb2 = new StringBuilder(fs[1]);
//数字反转
sb1.reverse();
sb2.reverse();
//分子为零的情况
if (sb1.length() == 0) {
sb1.append("0");
}
System.out.println(sb1 + "/" + sb2);
} else if (str.contains("%")) {
String[] bfs = str.split("%");
bfs[0] = bfs[0].replaceAll("0+$", "");
StringBuilder sb = new StringBuilder(bfs[0]);
sb.reverse();
//百分数为零的情况
if (sb.length() == 0) {
sb.append("0");
}
System.out.println(sb + "%");
} else {
if (str.equals("0")) {
System.out.println("0");
}
StringBuilder sb = new StringBuilder(str);
sb.reverse();
String sbString = sb.toString();
String output = sbString.replaceFirst("^0+", "");
System.out.println(output);
}
}
}
到了这里,关于P1553 数字反转(升级版)(JAVA)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!