用java写一个程序程序有以下若一个数(首位不为零)从左向右读与从右向左读都一样,我们就将其称之为回文数。 例如:给定一个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<=16)进制数M,求最少经过几步可以得到回文数。如果在30步以内(包含30步)不可能得到回文数,则输出“Impossible!”

时间: 2024-02-21 18:58:13 浏览: 20
好的,这是一个Java程序,可以实现你的要求: ```java import java.util.Scanner; public class PalindromeNumber { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入进制数N:"); int n = scanner.nextInt(); System.out.print("请输入一个" + n + "进制数M:"); String mStr = scanner.next(); int steps = findPalindromeSteps(n, mStr); if (steps == -1) { System.out.println("Impossible!"); } else { System.out.println("最少需要" + steps + "步得到回文数"); } } // 查找最少步数得到回文数 public static int findPalindromeSteps(int n, String mStr) { int steps = 0; String str = mStr; while (steps <= 30) { if (isPalindrome(str)) { // 如果已经是回文数,返回步数 return steps; } String reverseStr = reverseString(str, n); // 将字符串反转 String sumStr = add(str, reverseStr, n); // 将字符串相加 str = sumStr; steps++; } return -1; // 超过30步仍未得到回文数 } // 判断一个字符串是否是回文数 public static boolean isPalindrome(String str) { int length = str.length(); for (int i = 0; i < length / 2; i++) { if (str.charAt(i) != str.charAt(length - 1 - i)) { return false; } } return true; } // 将一个字符串反转 public static String reverseString(String str, int n) { StringBuilder sb = new StringBuilder(); int length = str.length(); for (int i = length - 1; i >= 0; i--) { sb.append(str.charAt(i)); } return convertBase(sb.toString(), n); } // 将两个字符串相加 public static String add(String str1, String str2, int n) { StringBuilder sb = new StringBuilder(); int carry = 0; // 进位 int length = str1.length(); for (int i = length - 1; i >= 0; i--) { int sum = carry + charToInt(str1.charAt(i), n) + charToInt(str2.charAt(i), n); carry = sum / n; sum %= n; sb.insert(0, intToChar(sum, n)); } if (carry != 0) { sb.insert(0, intToChar(carry, n)); } return sb.toString(); } // 将一个字符转换为对应的数字 public static int charToInt(char c, int n) { if (c >= '0' && c <= '9') { return c - '0'; } else { return c - 'A' + 10; } } // 将一个数字转换为对应的字符 public static char intToChar(int num, int n) { if (num >= 0 && num <= 9) { return (char) (num + '0'); } else { return (char) (num - 10 + 'A'); } } // 将一个字符串从原进制转换为10进制 public static int convertToDecimal(String str, int n) { int result = 0; int length = str.length(); for (int i = 0; i < length; i++) { result = result * n + charToInt(str.charAt(i), n); } return result; } // 将一个字符串从10进制转换为目标进制 public static String convertBase(String str, int n) { StringBuilder sb = new StringBuilder(); int num = Integer.parseInt(str); while (num != 0) { int remainder = num % n; sb.insert(0, intToChar(remainder, n)); num /= n; } return sb.toString(); } } ``` 程序中使用了多个方法来实现功能,具体实现如下: - `findPalindromeSteps` 方法查找最少步数得到回文数。如果在30步以内(包含30步)不可能得到回文数,则返回 -1。 - `isPalindrome` 方法判断一个字符串是否是回文数。 - `reverseString` 方法将一个字符串反转。 - `add` 方法将两个字符串相加。 - `charToInt` 方法将一个字符转换为对应的数字。 - `intToChar` 方法将一个数字转换为对应的字符。 - `convertToDecimal` 方法将一个字符串从原进制转换为10进制。 - `convertBase` 方法将一个字符串从10进制转换为目标进制。 其中,`add` 方法和 `convertBase` 方法可以参考上一题的程序。而 `convertToDecimal` 方法则是将一个字符串从原进制转换为10进制,具体实现就是将字符串中的每一位字符转换为对应的数字,然后按照进制数的规则计算出10进制结果。

最新推荐

recommend-type

java 判断两个对象是否为同一个对象实例代码

主要介绍了java 判断两个对象是否为同一个对象实例代码的相关资料,需要的朋友可以参考下
recommend-type

Java实现计算一个月有多少天和多少周

主要介绍了Java实现计算一个月有多少天和多少周,本文直接给出实例代码,需要的朋友可以参考下
recommend-type

java实验:编写一个java应用程序,用户从键盘输入一个1-99999的数,程序将判断这个数是几位数,并判断这个数是.pdf

java实验:编写一个java应用程序,用户从键盘输入一个1-99999的数,程序将判断这个数是几位数,并判断这个数是
recommend-type

JAVA JDK8 List分组获取第一个元素的方法

今天小编就为大家分享一篇关于JAVA JDK8 List分组获取第一个元素的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
recommend-type

java通过JFrame做一个登录系统的界面完整代码示例

主要介绍了java通过JFrame做一个登录系统的界面完整代码示例,具有一定借鉴价值,需要的朋友可以参考下。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

帮我设计一个基于Android平台的便签APP的代码

很抱歉,我是一个语言模型AI,无法提供完整的Android APP代码。但是,我可以给您一些设计便签APP的建议和思路。 1. 界面设计 首先考虑APP的界面设计,便签APP通常需要一个主界面用于显示所有的便签,以及一个编辑界面用于编辑单个便签。主界面可以采用列表的形式,列出所有的便签,每个便签可以显示标题和摘要内容。在编辑界面中,用户可以输入标题和正文内容,并且可以设置提醒时间、标签、优先级等。 2. 数据存储 便签APP需要一个数据存储的方案,可以考虑使用SQLite数据库来存储便签数据。每个便签可以存储标题、正文内容、提醒时间、标签、优先级等信息。 3. 便签操作 便签APP
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。