大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn
回文数
描述
若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。
例如:给定一个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(2<=N<=10或N=16)
第二行为N进制数M(0<=M<=maxlongint)
输出格式
共一行
第一行为“STEP=”加上经过的步数或“Impossible!”
样例1
样例输入1
9
87
样例输出1
STEP=6
代码
import java.util.Scanner;
public class Main {
static int jz, n, s = 1;
static String x;
static int[] a = new int[10001];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
jz = sc.nextInt();
x = sc.next();
n = x.length();
sc.close();
for (int i = 1; i <= n; i++) {
if (x.charAt(i - 1) < 65)
a[i] = x.charAt(i - 1) - '0';
else
a[i] = x.charAt(i - 1) - 55;
}
while (s <= 30) {
if (pdhw(n) == 1) {//如果为回文数
System.out.println("STEP=" + (s - 1));
return;
}
s++;//次数加一
n = jf(n);
}
System.out.println("Impossible!");
}
private static int jf(int n) {//对a进行加法处理
int[] c = new int[10001];
int s = 1;
for (int i = 1; i <= n; i++) {
c[i] = a[i] + a[n - i + 1] + c[i];//此处c[i]可能由于进制问题已经往前进了一位,故须加上
c[i + 1] += c[i] / jz;//比如15在10进制下进1
c[i] %= jz;//15在10进制下该位为5
}
if (c[n + 1] != 0)//如果最后一位进位则要将长度+1
n++;
for (int i = n; i >= 1; i--) {//由于c是由从右到左得到的,故需要进行反转
a[s] = c[i];
s++;
}
return n;//返回的值为此时a[]的长度
}
public static int pdhw(int n) {//判断是否为回文数
for (int i = 1; i <= n / 2; i++)
if (a[i] != a[n - i + 1])
return 0;
return 1;
}
}
2020年7月13日更
大家觉得写还可以,可以点赞、收藏、关注一下吧!
也可以到我的个人博客参观一下,估计近几年都会一直更新!和我做个朋友吧!https://motongxue.cn