​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.执行结果

PAT 1136 Java版_数据

​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。

PAT 1136 Java版_数据_02