计算回文数问题

xj33hf0331 2013-05-22 04:11:01
题目:
"回文数"是一种数字。如:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,所以这个数字就是回文数。
一个数字,把它的各位数字上数字倒过来排列组成一个新数,然后与原数相加,如果是回文数则停止,如果不是,则重复这个操作,直到和为回文数为止。如果在30步以外(含30步)不可能得到回文数,则输出0。输入的数保证不为回文数。

详细描述:
在caculateHuiWenShu函数中实现该功能:

/* 功能:

* 输入:int 一个小于的进制数

* 输出:把它的各位数字上数字倒过来排列组成一个新数,然后与原数相加,如果是回文数则停止,如果不是,则重复这个操作,直到和为回文数为止,并输出次数,如果次计算不能得到回文数,则输出。

* 返回:

例如:进制则有:

STEP1: 87+78=165

STEP2: 165+561=726

STEP3: 726+627=1353

STEP4: 1353+3531=4884

则输出 4

*/

输入一个0<=m的非回文数,输出为计算的步数 异常情况返回0
输入样例:
78
返回值样例:
4


public static long caculateHuiWenShu(int input)
{
if(input<0)
{
return (long)0;
}

StringBuffer sb=new StringBuffer();
sb.append(input);
long result=0;
for(long i=0;i<30;i++){
result=(Long.valueOf(sb.toString())+Long.valueOf(sb.reverse().toString()));
sb.setLength(0);
sb.append(result);
if(result==Long.valueOf(sb.reverse().toString())){
return (long)(i+1);
}
sb.setLength(0);
sb.append(result);
}
return (long)0;
}


题目和我的代码如上。但是测试案例没有完全通过,因为看不到测试案例,自己也找不到错误,希望有人帮忙解答一下,谢谢。
...全文
384 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fsh2008 2013-05-23
  • 打赏
  • 举报
回复
从代码逻辑来看,暂时没看出有什么问题,你的测试案例是哪来的,就一个没通过而没有说原因? 另外,编码规范确实需要注意,在实际工作中,是很重要的。
oh_Maxy 2013-05-23
  • 打赏
  • 举报
回复
练了下手,不晓得符合要求不:
public class ReverseNum
{

    private static int times = 0;

    public static void processNum(int num)
    {
        if (num < 0)
        {
            System.out.println("请输入非负整数。");
            return;
        }
        BigDecimal bd = new BigDecimal(num);
        StringBuilder sb = new StringBuilder(5);
        StringBuilder bs = new StringBuilder(5);

        while (times++ <= 30)
        {
            sb.append(bd);
            bs.append(bd).reverse();
            if (sb.toString().equals(bs.toString()))
            {
                System.out.println("经过" + (times - 1) + "次操作,得到回文数:" + sb);
                return;
            }

            bd = bd.add(new BigDecimal(bs.toString()));
            System.out.println("Step " + times + ":" + sb + " + " + bs + " = " + bd);
            sb.setLength(0);
            bs.setLength(0);
        }

        System.out.println("超过三次,没能找到回文数。。");
    }

    public static void main(String[] args)
    {
        int num = 0;
        System.out.print("请输入非负整数:");
        Scanner sc = new Scanner(System.in);
        try
        {
            num = Integer.valueOf(sc.next());
        }
        catch (Exception e)
        {
            System.out.println("输入的数字不合法!");
        }

        processNum(num);
    }
}
Mourinho 2013-05-23
  • 打赏
  • 举报
回复
CSDN居然能把代码显示成注释的颜色!无力吐槽 重新贴下代码

public class Test1 {
	public static void main(String[] args) {
		long value = calcPlalindrome(78);
		System.out.println(value);
	}

	static int calcPlalindrome(int num) {
		final int err = 0;// 异常返回值
		final int MAX_STEP = 30;// 最大步数
		if (num < 0 || isPlalindrome(num)) {
			return err;
		}
		for (int i = 1; i <= MAX_STEP; ++i) {
			int reverseNum = getReverseNum(num);
			System.out.printf("STEP%d: %d+%d=%d\n", i, num, reverseNum, num
					+ reverseNum);
			num += reverseNum;
			if (isPlalindrome(num))
				return i;
		}
		return 0;
	}

    //把一个数的各位数字上数字倒过来排列组成一个新数
	static int getReverseNum(int num) {
		int newNum = 0;
		while (num > 0) {
			int n = num % 10;
			newNum *= 10;
			newNum += n;
			num /= 10;
		}
		return newNum;
	}

	//判断是否为回文数
	static boolean isPlalindrome(int num) {
		return num == getReverseNum(num);
	}
}
Mourinho 2013-05-23
  • 打赏
  • 举报
回复

/*
 * 题目:
  "回文数"是一种数字。如:98789, 这个数字正读是98789,倒读也是98789,正读倒读一样,所以这个数字就是回文数。 
一个数字,把它的各位数字上数字倒过来排列组成一个新数,然后与原数相加,如果是回文数则停止,
如果不是,则重复这个操作,直到和为回文数为止。如果在30步以外(含30步)不可能得到回文数,则输出0。输入的数保证不为回文数。

详细描述:
在caculateHuiWenShu函数中实现该功能:

功能:
 * 输入:int 一个小于的进制数
 * 输出:把它的各位数字上数字倒过来排列组成一个新数,然后与原数相加,如果是回文数则停止,
 * 如果不是,则重复这个操作,直到和为回文数为止,并输出次数,如果次计算不能得到回文数,则输出。
 * 返回:
      例如:进制则有:
     STEP1: 87+78=165
     STEP2: 165+561=726
     STEP3: 726+627=1353
     STEP4: 1353+3531=4884
     则输出 4
输入一个0<=m的非回文数,输出为计算的步数 异常情况返回0
输入样例:
78
返回值样例:
4
 */

public class Test1 {
	public static void main(String[] args) {
		long value = calcPlalindrome(78);
		System.out.println(value);
	}

	static int calcPlalindrome(int num) {
		final int err = 0;// 异常返回值
		final int MAX_STEP = 30;// 最大步数
		if (num < 0 || isPlalindrome(num)) {
			return err;
		}
		for (int i = 1; i <= MAX_STEP; ++i) {
			int reverseNum = getReverseNum(num);
			System.out.printf("STEP%d: %d+%d=%d\n", i, num, reverseNum, num
					+ reverseNum);
			num += reverseNum;
			if (isPlalindrome(num))
				return i;
		}
		return 0;
	}

	/*
	 * 把一个数的各位数字上数字倒过来排列组成一个新数
	 */
	static int getReverseNum(int num) {
		int newNum = 0;
		while (num > 0) {
			int n = num % 10;
			newNum *= 10;
			newNum += n;
			num /= 10;
		}
		return newNum;
	}

	/*
	 * 判断是否为回文数
	 */
	static boolean isPlalindrome(int num) {
		return num == getReverseNum(num);
	}
}

cl28766 2013-05-22
  • 打赏
  • 举报
回复
高精度+反转函数则可.
u010673021 2013-05-22
  • 打赏
  • 举报
回复
既然用了StringBuffer 里的reverse方法多好呀,你这一坨子代码,看着就累!!我的思路就是封装好方法直接用,返回数不等,就继续加,循环30次,判断一下,即可!!这题并不是很复杂!
u010673021 2013-05-22
  • 打赏
  • 举报
回复
这种题最好一个方法一个方法封装着写,这么一坨子代码,不太好吧。最常用的方法,就是把数字倒过来,要写出这个方法才是关键,其他都是小事情

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧