PAT甲级1024 Palindromic Number

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;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值