70 回文数
作者: Turbo时间限制: 1S章节: 模拟
问题描述 :
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
我们现在需要产生回文数,步骤如下:
给定一个10进制数56,将56加65(即把56从右向左读),得到121是一个回文数。
又如:对于10进制数87:
STEP1:87+78 = 165
STEP2:165+561 = 726
STEP3:726+627 = 1353
STEP4:1353+3531 = 4884
在这里的“一步”是指进行了一次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 test_70 {
/**
* 70 回文数
*/
;
//16进制数字为0-9与A-F
private static char[] hex = {'A', 'B', 'C', 'D', 'E', 'F'};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
sc.nextLine();
String m = sc.next().trim();
String re;
StringBuilder builder = new StringBuilder();
int count = 1;
boolean flag = false;
while (count <= 30) {
re = add(m,builder,n);
builder.setLength(0);
//逆位进制相加后为回文数
if(builder.append(re).reverse().toString().compareTo(re)==0){
flag=true;
break;
}
//buildder 清空
builder.setLength(0);
//本次返回作为下一次请求入参
m = re;
count++;
}
if (flag) {
System.out.println("STEP=" + count);
} else {
System.out.println("Impossible!");
}
}
private static String add(String s, StringBuilder builder,int n) {
char[] chars = s.toCharArray();
int jinwei = 0, tempA = 0, tempB = 0, temp;
for (int i = 0; i < chars.length; i++) {
tempA = chars[i] - '0';
tempB = chars[chars.length - i - 1] - '0';
//十六进制
if (n == 16) {
if (chars[i] >= 'A' && chars[i] <= 'F') {
tempA = chars[i] - 'A' + 10;
}
if (chars[chars.length - i - 1] >= 'A' && chars[chars.length - i - 1] <= 'F') {
tempB = chars[chars.length - i - 1] - 'A' + 10;
}
}
temp = jinwei + tempA + tempB;
//是否产生进位
if (temp >= n) {
jinwei = 1;
temp %= n;
if (temp >= 10) {
builder.append((char) ('A' + temp - 10));
} else {
builder.append(temp);
}
} else {
jinwei = 0;
if (temp < 10) {
builder.append(temp);
} else {
builder.append((char) ('A' + temp));
}
}
}
//最后一次是否产生进位
if (jinwei == 1) {
builder.append(1);
}
s = builder.reverse().toString();
//System.out.println(s+" "+builder.toString());
builder.setLength(0);
return s;
}
}