PAT 1136
Java
版
1.题意
- step 1.首先给出了回文数的定义
- step 2.如果对于一个非回文数,那么我们可以通过一定的步骤将其变成回文数。
- step 3.如果在10此循环中都无法得到回文数,那么就输出
Not found in 10 iterations.
- step 4.如果该数就是回文数,或者通过一定步骤可以得到一个回文数,则输出
xxx is a palindromic number.
2. 分析
- 因为存在有数据位数比较大的情况,这里使用了
BigInteger
类计算两个数的和。 - 分四个方法,分别是用于计算逆转数,求和,判断是否回文,以及
main
方法
3.测试用例
97152
196
0
4.代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
Reader.init(System.in);
String origin = Reader.next();
int count = 0;
while (count < 10 ) {
if (isPalindromic(origin)) {
System.out.printf("%s is a palindromic number.",origin);
break;
}
String reverse = reverse(origin);
origin = cal(origin, reverse);
//System.out.println(isPalindromic(cal(origin,reverse)));
count++;
}
if (count == 10) {
System.out.println("Not found in 10 iterations.");
}
}
//计算number的倒数
//因为 number 可能会很大,所以需要使用String 存储
public static String reverse(String number) {
String reverse="" ;
char c ;
for (int i = number.length() - 1; i >= 0; i--) {
c = number.charAt(i); // get the
reverse = reverse + c;
}
return reverse;
}
//计算两个整数的和
public static String cal(String num1,String num2) {
BigInteger bi_1 = new BigInteger(num1);
BigInteger bi_2 = new BigInteger(num2);
BigInteger sum = bi_1.add(bi_2);
System.out.printf("%s + %s = %s",bi_1.toString(),bi_2.toString(),sum.toString());
System.out.println();
return sum.toString();
}
//对一个数进行回文判断
public static boolean isPalindromic(String number) {
final boolean FALSE = false;
final boolean TURE = true;
int k = number.length();
int i =0;
int mid = k/2;
while (i < mid) {
if(number.charAt(i) != number.charAt(k - 1 - i))
break;
i++;
}
if (i < mid) {
return FALSE;
}
return TURE;
}
}
class Reader {
static BufferedReader reader;
static StringTokenizer tokenizer;
/** call this method to initialize reader for InputStream */
static void init(InputStream input) throws IOException {
reader = new BufferedReader(new InputStreamReader(input) );
tokenizer = new StringTokenizer("");
}
/** get next word */
static String next() throws IOException {
while ( ! tokenizer.hasMoreTokens() ) {//如果后面还有数据,则直接返回
//TODO add check for eof if necessary
tokenizer = new StringTokenizer(reader.readLine() );//否则,读取下一行
}
return tokenizer.nextToken();
}
static int nextInt() throws IOException {
return Integer.parseInt( next() );
}
static double nextDouble() throws IOException {
return Double.parseDouble( next() );
}
//获取字符 => 因为 next()方法返回的是一个String
static char nextChar() throws IOException {
return next().charAt(0);
}
}
5.执行结果
400ms
都有超时的情况,因为这是java。优化过程如下:
6.优化过程
- 可以看到上述的代码中使用了
String
进行了一个拼接,导致出现运行超时,我们使用 StringBuilder
替换 String
,得到代码如下:
public static String reverse(String number) {
StringBuilder reverse= new StringBuilder();
char c ;
for (int i = number.length() - 1; i >= 0; i--) {
c = number.charAt(i); // get the
reverse.append(c);
}
return reverse.toString();
}
再次提交代码,ok。