题目来源:洛谷P1553
题目描述
给定一个数,请将该数各个位上数字反转得到一个新数。
这次与NOIp2011普及组第一题不同的是:这个数可以是小数,分数,百分数,整数。
-
整数反转是将所有数位对调。
-
小数反转是把整数部分的数反转,再将小数部分的数反转,不交换整数部分与小数部分。
-
分数反转是把分母的数反转,再把分子的数反转,不交换分子与分母。
-
百分数的分子一定是整数,百分数只改变数字部分。
输入格式
一个数 ss
输出格式
一个数,即 ss 的反转数
输入输出样例
输入 #1 | 输出 #1 |
---|---|
5087462 | 2647805 |
输入 #2 | 输出 #2 |
600.084 | 6.48 |
输入 #3 | 输出 #3 |
700/27 | 7/72 |
输入 #4 | 输出 #4 |
8670% | 768% |
说明/提示
所有数据:25%s是整数,不大于20位
25%s是小数,整数部分和小数部分均不大于10位
25%s是分数,分子和分母均不大于10位
25%s是百分数,分子不大于19位
(20个数据)
数据保证:
-
对于整数翻转而言,整数原数和整数新数满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数和原来的数字的最高位数字不应为零。
-
对于小数翻转而言,其小数点前面部分同上,小数点后面部分的形式,保证满足小数的常见形式,也就是末尾没有多余的 00(小数部分除了 00 没有别的数,那么只保留 11 个 00。若反转之后末尾数字出现 00,请省略多余的 00)
-
对于分数翻转而言,分数不约分,分子和分母都不是小数。输入的分母不为0。与整数翻转相关规定见上。
-
对于百分数翻转而言,见与整数翻转相关内容。
数据不存在负数。
题解
在之前的题目中,我们可以实现对整数进行数字翻转。那么,我们能不能把一个数前后拆成两个整数来看呢?
在做整数的反转时,我的方法是[1]
- 输入一个字符串。
- 对该字符串进行反转。
- 用Long类的valueOf(string)方法将字符串转为整数。
- 用String类的valueOf(value)方法将整数转为字符串。
显然,第3 4步的作用是去除翻转后数字前多余的零。
Num = String.valueOf(Long.valueOf(ReTurn(Num)));
/*
函数功能:翻转一个字符串
参数:字符串
返回值:字符串
*/
public static String ReTurn(String text) {
char[] textList = new char[text.length()];
int i;
for (i = 0; i <= textList.length - 1; i++) {
textList[i] = text.charAt(i);
}
int s, e;
char t;
s = 0;
e = textList.length - 1;
for (; e - s > 0; s++, e--) {
t = textList[s];
textList[s] = textList[e];
textList[e] = t;
}
String reTxt;
reTxt = String.valueOf(textList);
return reTxt;
}
现在看一下这道题:
首先,我们需要一个方法,可以判断输入的数是整数、小数、分数、还是百分数。
小数中一定含有“.”,分数中一定含有“/”,百分数中一定含有“%”
使用String类提供的contains(string)方法,即可判断该数的类型。
String类方法:contains(s1)
描述:如果s1是该字符串的字字符串,返回true
/*
函数功能:判断一个数字的类型,1为整数,2为小数,3为分数,4为百分数
参数:字符串
返回值:整数
*/
public static int NumType(String Num) {
if (Num.contains("."))
return 2;//小数
else if (Num.contains("/"))
return 3;//分数
else if (Num.contains("%"))
return 4;//百分数
else
return 1;//整数
}
如果是整数:
直接使用[1]
如果是小数:
- 使用String类的indexOf(string)和insubstring(beinIndex,endIndex)方法返回小数的整数部分。
- 对整数部分使用[1]。
- 使用String类的indexOf(string)和insubstring(beinIndex)方法返回小数的小数部分。
- 对小数部分依次使用[1]的1,3,4,2步(更改步骤顺序的目的是除去翻转后数字后多余的零)。
- 使用String类的contains(string)方法将整数部分,“.”和小数部分连接。
String类方法:indexOf(ch)
描述:返回字符串中第一个出现ch的下标。如果没有匹配的,返回-1
String类方法:insubstring(beinIndex)
描述:返回该字符串的字串,从指定位置beginIndex的字符开始到字符串的结尾
String类方法:insubstring(beinIndex,endIndex)
描述:返回该字符串的字串,从指定位置beginIndex的字符开始到下标为endIndex - 1的字符
Num = String.valueOf(Long.valueOf(ReTurn(Num.substring(0, Num.indexOf('.')))))
.concat(".").concat(ReTurn(String.valueOf(Long.valueOf(Num.substring(Num.indexOf('.') + 1)))));
如果是分数:
- 使用String类的indexOf(string)和insubstring(beinIndex,endIndex)方法返回分数的分子部分。
- 对分子部分使用[1]。
- 使用String类的indexOf(string)和insubstring(beinIndex)方法返回分数的分母部分。
- 对分母部分使用[1]。
- 使用String类的contains(string)方法将分子部分,“/”和分母部分连接。
Num = String.valueOf(Long.valueOf(ReTurn(Num.substring(0, Num.indexOf('/')))))
.concat("/").concat(String.valueOf(Long.valueOf(ReTurn(Num.substring(Num.indexOf('/') + 1)))));
如果是百分数:
- 使用String类的indexOf(string)和insubstring(beinIndex,endIndex)方法返回百分数百分号前面的数字部分。
- 对数字部分使用[1]。
- 使用String类的contains(string)方法将数字部分和“%”连接。
Num = String.valueOf(Long.valueOf(ReTurn(Num.substring(0, Num.indexOf('%'))))).concat("%");
完整代码如下:
import java.util.Scanner;
public class P1553 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
String Num;
Num = input.nextLine();
switch (NumType(Num)) {
case 1://整数
Num = String.valueOf(Long.valueOf(ReTurn(Num)));
break;
case 2://小数
Num = String.valueOf(Long.valueOf(ReTurn(Num.substring(0, Num.indexOf('.')))))
.concat(".").concat(ReTurn(String.valueOf(Long.valueOf(Num.substring(Num.indexOf('.') + 1)))));
break;
case 3://分数
Num = String.valueOf(Long.valueOf(ReTurn(Num.substring(0, Num.indexOf('/')))))
.concat("/").concat(String.valueOf(Long.valueOf(ReTurn(Num.substring(Num.indexOf('/') + 1)))));
break;
case 4://百分数
Num = String.valueOf(Long.valueOf(ReTurn(Num.substring(0, Num.indexOf('%'))))).concat("%");
break;
}
System.out.print(Num);
}
/*
函数功能:判断一个数字的类型,1为整数,2为小数,3为分数,4为百分数
参数:字符串
返回值:整数
*/
public static int NumType(String Num) {
if (Num.contains("."))
return 2;//小数
else if (Num.contains("/"))
return 3;//分数
else if (Num.contains("%"))
return 4;//百分数
else
return 1;//整数
}
/*
函数功能:翻转一个字符串
参数:字符串
返回值:字符串
*/
public static String ReTurn(String text) {
char[] textList = new char[text.length()];
int i;
for (i = 0; i <= textList.length - 1; i++) {
textList[i] = text.charAt(i);
}
int s, e;
char t;
s = 0;
e = textList.length - 1;
for (; e - s > 0; s++, e--) {
t = textList[s];
textList[s] = textList[e];
textList[e] = t;
}
String reTxt;
reTxt = String.valueOf(textList);
return reTxt;
}
}
引用
- 梁勇,戴开宇. 数学函数、字符和字符串. 《Java语言程序设计与数据结构》2018
- P1553 数字反转 (升级版). 洛谷 [引用日期2022-01-18]