英雄会挑战之回文数—题目解析

失落夏天
Android领域优质创作者
博客专家认证
2014-01-06 07:13:50
题目详情

如果一个数正着读和反着读一样大,则这个数叫做回文数,例如121是回文数,123454321是回文数。


现给定一个正整数x,输出一个回文数y,要求y > x,并且组成x的所有数字之和与组成y的所有数字之和相等,以及y > x。

x在10^1000以内,因为数字较大,我们用字符串作为输入和输出。

如果无解,请输出Impossible。如果有多个y,输出最小的那个。


例如:

输入919,输出14941

输入1,输出Impossible
代码如下:
随笔写的,所以代码结构显得有点乱。
代码复杂程度为O(n);级别的。
本地运算时间不到1毫秒。
结果提交程序显示:

啥也不说了。好在不是图你们的那些奖品,要不非得气死。

package com;

public class Test {
public static String palindrom(String a) {
String result = "";
char[] ch = a.toCharArray();
int num = 0;
for (int i : ch) {
num += (i - 48);
}
if (num == 1) {
result = "Impossible";
return result;
}
switch (ch.length) {
case 2:
if (num % 2 == 0) {
// 首先判断2位的长度是否可以
if (num >= (ch[0] - 47) * 2) {
result = num / 2 + "" + num / 2;
} else {
int i = (num - 9) / 2;
i = (i <= 0) ? 1 : i;
result = i + "" + (num - 2 * i) + "" + i;
}
} else {
int i = (num - 9) / 2;
i = (i <= 0) ? 1 : i++;
result = i + "" + (num - 2 * i) + "" + i;
}
break;
case 3:
if (!(ch.length == 1 || ch.length == 2 || ch[0] - 48 == 9)) {

int i = ch[0] - 47;
int ii = num - 2 * i;
if (ii >= 0 && ii < 10) {
result = i + "" + ii + "" + i;
return result;
}
}
if (num % 2 == 0) {
int i = num - 18;

i = (i <= 0) ? 2 : i;
System.out.println("i:" + i);
int ii = (num - 2) / 2;
switch (i / 2) {
case 1:
result = "1" + ii + "" + ii + "" + "1";
break;
case 2:
result = "2" + ii + "" + ii + "" + "2";
break;
case 3:
result = "3" + ii + "" + ii + "" + "3";
break;
default:
result = "4" + ii + "" + ii + "" + "4";
break;
}
} else {
int i = (num - 11) / 2;

int ii = (i <= 0) ? 0 : i;

int iii = num - 2 - (2 * ii);
switch (i / 2) {
case 1:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
case 2:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
case 3:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
case 4:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
case 5:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
case 6:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
case 7:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
case 8:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
default:
result = "1" + ii + "" + iii + "" + ii + "" + "1";
break;
}
}
break;
default:
break;
}

return result;
}

// start 提示:自动阅卷起始唯一标识,请勿删除或增加。
public static void main(String args[]) {
System.out.println(palindrom("999"));
}
// end //提示:自动阅卷结束唯一标识,请勿删除或增加。
}
...全文
335 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
失落夏天 2014-12-17
  • 打赏
  • 举报
回复
代码确实有错,有空会重新调试 但是那个在线编译测试功能真不咋地。
绿色夹克衫 2014-01-28
  • 打赏
  • 举报
回复
感觉这个程序问题挺多,随便测了一个 System.out.println(palindrom("991231232343453451231242345911")); 没有输出结果
cao_yunfei 2014-01-07
  • 打赏
  • 举报
回复
引用 2 楼 AA5279AA 的回复:
[quote=引用 1 楼 cao_yunfei 的回复:] 貌似程序有些小BUG! 输入66 打印1101 输入77 打印2102
没有办法修改原帖了。。 思路没错,敲代码的时候想错了 第28行 i = (i <= 0) ? 1 : i++; 改成 i = (i <= 0) ? 1 : i+1; 就可以了。。。[/quote] 还是不行! 需要改23行 i = (i <= 0) ? 1 : i; 改成 i = (i <= 0) ? 1 : i+1; 才行!
卡卡吉利 2014-01-07
  • 打赏
  • 举报
回复
这个题我也做了,我自己跑最大数据1s完成,提交他总说超过3S
失落夏天 2014-01-07
  • 打赏
  • 举报
回复
引用 1 楼 cao_yunfei 的回复:
貌似程序有些小BUG! 输入66 打印1101 输入77 打印2102
没有办法修改原帖了。。 思路没错,敲代码的时候想错了 第28行 i = (i <= 0) ? 1 : i++; 改成 i = (i <= 0) ? 1 : i+1; 就可以了。。。
cao_yunfei 2014-01-07
  • 打赏
  • 举报
回复
貌似程序有些小BUG! 输入66 打印1101 输入77 打印2102

50,526

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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