一个正整数,如果交换高低位以后和原数相等,那么称这个数为回文数。比如 121121,23322332都是回文数,13,456713,4567 不是回文数。
任意一个正整数,如果其不是回文数,将该数交换高低位以后和原数相加得到一个新的数,如果新数不是回文数,重复这个变换,直到得到一个回文数为止。例如,57 变换后得到 132(57 + 75),132 得到 363(132 + 231),363363 是一个回文数。
曾经有数学家猜想:对于任意正整数,经过有限次上述变换以后,一定能得出一个回文数。至今这个猜想还没有被证明是对的。现在请你通过程序来验证。
输入格式
输入一行一个正整数 n。
输出格式
输出第一行一个正整数,表示得到一个回文数的最少变换次数。
接下来一行,输出变换过程,相邻的数之间用”—->”连接。输出格式可以参见样例。
保证最后生成的数在 int 范围内。
样例输入
349
样例输出
3
349—->1292—->4213—->7337
分析:(虽然没什么好分析的),题目要求是将一个数进行判断是否为回文数,若不是回文数,则经过一系列转变,变成回文数并输出转变过程。
对其过程进行分析,其大概是需要如下步骤:
1.判断该数是否回文
2.将该数的对称位置进行交换,得到新数
3.将新数与之前的数相加,判断此数是否回文,并重复操作直到回文。
到这里,我们能知道,我们需要两个int型变量来保存数值,也就是如下代码中的value和v,另外的value1 保存二者之和。
因为要设计对数字的拆分和比较,所以考虑将数字转换为int 型数组,便于比较,封装了一个方法 Number2Array(int number):寓意number to array。
当然还会涉及到将int型数组转换为int型数据,因此封装了另一个方法Array2Number(int[] arr):寓意array to number。
此外,该程序还会涉及数组元素的交换,因此封装另外的一个方法swap(int arr[],int index),作用是将index指定对称的arr中元素交换。
最后,还有一个问题,就是答案的输出,观察,第二行我们可以考虑采用字符串的形式进行输出,参考代码中的strAnswer;第一行,一个int型变量即可,参考答案中的times。
本程序,还有一部分写的比较粗糙,就是while循环中有一个flags,循环外有个flag,都是用来判断循环是否继续的约束,其原理是:只要满足该数字对称(回文),则结束循环,否则继续。
整体代码如下:
import java.util.Scanner;
public class HuiWenNumber
{
public static void main(String[] args)
{
Scanner sc=new Scanner(System.in);
String strValue=sc.nextLine();
int value=Integer.parseInt(strValue);
int values[]=Number2Array(value);
int times=0;
String strAnswer=Integer.toString(value);
boolean flag=values[0]!=values[values.length-1]?true:false;
while(flag)
{
times++;
strAnswer+="--->";
int v=Array2Number(values);
for(int i=0;i
运行结果如图所示:
测评结果: