Java算法:回文数

一个正整数,如果交换高低位以后和原数相等,那么称这个数为回文数。比如 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();
	}
}

运行结果如图所示:

测评结果:

原创文章 42 获赞 72 访问量 8222

猜你喜欢

转载自blog.csdn.net/weixin_43249548/article/details/100632144
今日推荐