Java算法:回文数

Dear 丶 2023-09-26 21:05 76阅读 0赞

一个正整数,如果交换高低位以后和原数相等,那么称这个数为回文数。比如 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<values.length/2;i++)
{
swap(values,i);
}
int value1=Array2Number(values)+v;
strAnswer+=Integer.toString(value1);
values=Number2Array(value1);

int flags=0;
for(int i=0;i<values.length/2;i++)
{
if(values[i]==values[values.length-1-i])
{
flags++;
}
}
if(flags==values.length/2)
{
flag=false;
}

}
System.out.println(times);
System.out.println(strAnswer);
}
public static int[] Number2Array(int number)
{
String value=Integer.toString(number);
char array[]=value.toCharArray();
int DecimalArray[]= new int[value.length()];
for(int i=0;i<value.length();i++)
{
DecimalArray[i]=array[i]-48;
}
return DecimalArray;
}
//It main act on transforming Integer Array to Number
public static int Array2Number(int arr[])
{
int value=0;
for(int i=0;i<arr.length;i++)
{
value+=Math.pow(10, arr.length-1-i)*arr[i];
}
return value;
}
//Swap some element of arr by the index
public static void swap(int arr[],int index)
{
int tmp=arr[arr.length-1-index];
arr[arr.length-1-index]=arr[index];
arr[index]=tmp;
}
//It can show all the elements of the arr in order
public static void show(int arr[])
{
for(int i=0;i<arr.length;i++)
{
System.out.print(arr[i]+” “);
}
System.out.println();
}
}**

运行结果如图所示:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzI0OTU0OA_size_16_color_FFFFFF_t_70

测评结果:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzI0OTU0OA_size_16_color_FFFFFF_t_70 1

发表评论

表情:
评论列表 (有 0 条评论,76人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java算法

    一个正整数,如果交换高低位以后和原数相等,那么称这个数为回文数。比如 121121,23322332都是回文数,13,456713,4567 不是回文数。 任意一个正整数,如

    相关

    题目: 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 示例 1: 输入: 121 输出: true 示例 2: 输