PAT 甲级 1024 Palindromic Number
前言:此题用什么数据类型特别重要,如果用long的话会有两个测试点通不过(更别说int了,通不过的更多),此题要求输入的N<10的10次方,由于考虑到相加,可能就会超出long的范围,这就是这两个测试点不能通过的原因,所以要用String
package higherlevel;
import java.util.Scanner;
public class I024 {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
String N=s.next(); //要回文的数字
int M=s.nextInt(); //最大步数
int count=0; //记录步数
if(pailnum(N)==true){ //首先判断N是不是回文数,如果是的话直接输出就行了,后边的操作就都不执行了
System.out.println(N);
System.out.print(count);
System.exit('1');
}
String str="";
while(count<M){
count++;
str=pil(N); //看pil方法
if(pailnum(str)==true){
break;
}
N=str;
}
System.out.println(str);
System.out.print(count);
}
//把一个数字倒过来的方法
public static String pil(String N){
char[] c=N.toCharArray();
char[] back=new char[c.length];
for(int i=0;i<c.length;i++){
back[i]=c[c.length-i-1];
}
String str="";
int carry=0; //进位标识
for(int i=c.length-1;i>=0;i--){
int s=c[i]+back[i]-48-48+carry;
if(s>=10){ //这个for循环实现两个数的相加,因为不能直接相加,会超出long范围
carry=s/10; //所以定义了carry变量,用来记录进位
s=s-10;
str=str+s;
}else{
carry=0;
str=str+s;
}
}
if(carry!=0){
str=str+carry;
}
char[] s=str.toCharArray();
str=""; //由于得到的数是倒着的,所以还得倒回来
for(int i=s.length-1;i>=0;i--){
str=str+s[i];
}
return str;
}
//判断一个数是不是回文数的方法
public static boolean pailnum(String str){
char[] c=str.toCharArray();
char[] back=new char[c.length];
for(int i=0;i<c.length;i++){
back[i]=c[c.length-i-1];
}
boolean flag=true;
for(int i=0;i<c.length;i++){
if(c[i]!=back[i]){
flag=false;
break;
}
}
if(flag==true){
return true;
}else {
return false;
}
}
}