题目描述
若一个数(首位不为零)从左向右读与从右向左读都是一样,我们就将其称之为回文数。例如:给定一个 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.求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible” 。
输入
给定一个N(2<N<=10或N=16)进制数M。
输出
最少几步。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible”。
样例输入
9 87
样例输出
6
高精度题的思路是把数据存于数组进行处理,其个别题型在Java语言中可以使用BigInteger BigDecimal 进行处理。
C语言解决这题型时一般采用将数组的数据长度存放在A[0]头元素,Java也可。
此处是使用传统的数组解题,数组长度单独存放在cur变量中:
因为是n进制所以把
当前位规范从A[i]%10 到 A[i]%n
进位规范从A[i]/10 改成 A[i]/n
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
String str=sc.next(); //字符串接收输入
int[] a=new int[100000];
int[] b=new int[100000];
int cur=str.length(); //此时数据长度为str长
for(int i=0;i<str.length();i++){ //存放入int数组
if(str.charAt(i)>='0' && str.charAt(i)<='9') a[i]=str.charAt(i)-'0';
else if(str.charAt(i)>='A' && str.charAt(i)<='Z') a[i]=str.charAt(i)-'A'+10;
else a[i]=str.charAt(i)-'a'+10; //90%正确的是因为未考虑小写字母的情况。。。。
}
int ans=0;
while(true){
if(ans>30){ //加法超过30次,则退出
System.out.println("Impossible");
break;
}
else{
if(huiwen(a,cur)){ //判断是否回文
System.out.println(ans);
break;
}
for(int i=0;i<cur;i++) b[i]=a[cur-i-1];//初始化b数组
//高精度加法模板
for(int i=0;i<cur;i++) a[i]+=b[i];
for(int i=0;i<cur;i++){ //
a[i+1]+=a[i]/n; //
a[i]%=n; //
} //
if(a[cur]>0) cur++; //(如果最高位有进位,数据长加1)
//
ans++;
}
}
}
static boolean huiwen(int[] a,int cur){
for(int i=0;i<cur;i++)
if(a[i]!=a[cur-i-1])
return false;
return true;
}
}