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();
    }
}

运行结果如图所示:

测评结果:

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值