首页 > 其他 > 详细

回文数

时间:2020-02-27 12:46:55      阅读:90      评论:0      收藏:0      [点我收藏+]
问题描述
  若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
  例如:给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。

  又如:
  在这里的一步是指进行了一次N进制的加法,上例最少用了4步得到回文数4884。

  写一个程序,给定一个N(2<=N<=10或N=16)进制数M(其中16进制数字为0-9与A-F),求最少经过几步可以得到回文数。
  如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
输入格式
  两行,N与M
输出格式
  如果能在30步以内得到回文数,输出“STEP=xx”(不含引号),其中xx是步数;否则输出一行”Impossible!”(不含引号)
样例输入
9
87
样例输出
STEP=6
import java.util.Scanner;


public class Main {

    /*
     * scale字符串对应的是十六进制以内,各个输的范围,在做加法时,用每个字符对应的index相加即可
     */
    static final String scale = "0123456789ABCDEF";
    
    
    /*
     * 判断是否为回文数,是返回true,否则返回false
     */
    public static boolean isPlindrome(String s) {
        String str = String.valueOf(s);
        for(int i=0; i<str.length()/2; i++) {
            if(str.charAt(i)!=str.charAt(str.length()-1-i)) {
                return false;
            }
        }
        return true;
    }
    
    /*
     * 将字符串反转,返回一个字符串
     */
    public static String digitalReversal(String s) {
        StringBuffer sb = new StringBuffer("");
        for(int i=s.length()-1; i>=0; i--) 
        {
            sb.append(String.valueOf(s.charAt(i)));
        }
        return sb.toString();
    }
    
    /*
     * 高精度加法,得到一个数与其数为反转后的数的和,返回为一个字符串
     */
    public static String add_AB(String A, String B, int k) {
        int temp = 0;
        int len = A.length();
        char[] a = A.toCharArray();
        char[] b = B.toCharArray();
        StringBuffer sb = new StringBuffer("");
        for(int i=0; i<len; i++) 
        {
            int m = scale.indexOf(String.valueOf(a[i]))+scale.indexOf(String.valueOf(b[i]))+temp;
            if(m>=k)
            {
                temp = m/k;
                m = m%k;
            }else 
            {
                temp = 0;
            }
            sb.append(String.valueOf(scale.charAt(m)));
        }
        if(temp!=0) 
        {
            sb.append(String.valueOf(scale.charAt(temp)));
        }
        return digitalReversal(sb.toString());
    }
    
    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);
        
        int k = input.nextInt();
        String s = input.next();
        int count = 0;
        while(!isPlindrome(s) && count<=30) {
            s = add_AB(s, digitalReversal(s),k);
            count++;
        }
        if(isPlindrome(s) && count<=30) 
        {
            System.out.println("STEP="+count);
        }else {
            System.out.println("Impossible!");
        }
        
    }


}

 

回文数

原文:https://www.cnblogs.com/shiaguang/p/12371492.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!