题目描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。 例如:给定一个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=10进制的加法,上例最少用了4步得到回文数48。 写一个程序,给定一个N(2≤N≤16)进制数M,求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”
输入
共两行
第一行为进制数N,2≤N≤16N
第二行为N进制数M,0≤M≤2^63−1
输出
共一行,为“STEP=经过的步数”或“Impossible!”
样例输入复制
9 87
样例输出复制
STEP=6
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int n = cin.nextInt();
String str = cin.next();
int len = str.length();
func(str);
while (!isPalindrome(len) && count <= 30) {
count++;
Arrays.fill(b, 0);
for (int i = 0; i < len; i++) {//进位
b[i] += a[i] + c[i];
b[i + 1] += b[i] / n;
b[i] = b[i] % n;
}
if (b[len] != 0) {//进位后长度
len++;
}
stockpile(len);
}
Print();
}
private static void stockpile(int len) {
Arrays.fill(a, 0);//正序数
Arrays.fill(c, 0);//逆序数
for (int i = 0; i < len; i++) {
a[i] = b[i];
c[len - i - 1] = a[i];
}
}
private static void Print() {
if (count <= 30) {
System.out.println("STEP=" + count);
} else {
System.out.println("Impossible!");
}
}
private static void func(String str) {
for (int i = 0; i < str.length(); i++) {
if (Character.isLetter(str.charAt(i))) {
a[i] = str.charAt(i) - 'A' + 10;
} else {
a[i] = str.charAt(i) - '0';
}
b[i] = a[i];
c[str.length() - i - 1] = a[i];
}
}
private static boolean isPalindrome(int len) {
int k = (len - 1) / 2;
int i;
for (i = 0; i <= k; i++) {
if (b[i] != b[len - i - 1]) break;
}
return i == k + 1;
}
static int count = 0;
static int[] a = new int[1000 + 5];
static int[] b = new int[1000 + 5];
static int[] c = new int[1000 + 5];
static Scanner cin = new Scanner(System.in);
}