Java算法:根据输入的数字计算所有的回文数
2014-01-05 15:34
260 查看
原创作品,允许转载,转载时请务必以超链接形式标明文章
原始出处 、作者信息和本人声明。否则将追究法律责任。
作者:永恒の_☆ 地址:http://write.blog.csdn.net/postedit/17849385
<2>然后需要计算输入的数字 的所有数字之和;
<3>再根据这个和依次拆分数字组成x的所有数字之和与组成y的所有数字之和相等,首先中间-2,首位和末位+1,然后递归下去直到结束,否则需要考虑-2以前的时候当前数字<10,并且判断回文数的时候需要满足首位与末位相等以外,还要保证y > x;
<4>最后根据返回的拼接字符串判断是否是回文数;
<5>统计所有满足条件的回文数,显示出来。
目前测试发现的问题有:
<1>在从最大数开始拆分的时候,被拆分的数如果大于9,组成x的所有数字之和与组成y的所有数字之和不相等,并且这个时候被拆分数仍旧可以继续拆分,这部分现在还没做处理;
<2>在递归拆分的时候考虑不周全,没有把所有的拆分元素加进去,而是通过下标完成的,比如添加的都是11、 22、 33等等元素 ;
<3>这里还有一个问题,回文数都是成双成对的,比如12321满足,同样21312也满足,可是目前还没有实现。
<2>输入234,效果如下:
<3>输入3,效果如下:
<4>输入11,效果如下:
原始出处 、作者信息和本人声明。否则将追究法律责任。
作者:永恒の_☆ 地址:http://write.blog.csdn.net/postedit/17849385
问题
如果一个数正着读和反着读一样大,则这个数叫做回文数,例如121是回文数,123454321是回文数。 现给定一个正整数x,输出一个回文数y,要求y > x,并且组成x的所有数字之和与组成y的所有数字之和相等,以及y > x。 x在10^1000以内,因为数字较大,我们用字符串作为输入和输出。 如果无解,请输出Impossible。如果有多个y,输出最小的那个。解答
1、解决思路
<1>首先要保证输入的数字是正整数,并且大于等于10,小于等于1000;<2>然后需要计算输入的数字 的所有数字之和;
<3>再根据这个和依次拆分数字组成x的所有数字之和与组成y的所有数字之和相等,首先中间-2,首位和末位+1,然后递归下去直到结束,否则需要考虑-2以前的时候当前数字<10,并且判断回文数的时候需要满足首位与末位相等以外,还要保证y > x;
<4>最后根据返回的拼接字符串判断是否是回文数;
<5>统计所有满足条件的回文数,显示出来。
2、具体实现
import java.util.Scanner; /** * 根据输入的整数返回回文数的demo * @author Administrator * */ public class HuiWenShuDemo { public static int huiwenCount = 0; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入一个正整数:"); int num = scanner.nextInt(); if( ! (num>=10 && num<=1000 ) ){ System.err.println("输入的整数不满足规范。"); return; } int total = calcNumTotal(num); calcHuiWenNum(total,num); if(huiwenCount==0){ System.out.println("Impossible"); }else{ System.out.println("总共统计出回文数有"+ huiwenCount + "个!"); } } /** * 根据传递的参数,返回该整数 所有数字之和 * @param num * @return */ public static int calcNumTotal(int num){ int total = 0; String tempStr = String.valueOf(num); for (int i = 0; i < tempStr.length(); i++) { total = total + Integer.valueOf(tempStr.subSequence(i, i+1).toString()); } return total; } /** * 根据传递的参数判断是否是回文数 * @param num * @return */ public static boolean isHuiWenNum(int newNum, int oldNum){ if(oldNum >= newNum){ return false; } String tempStr = String.valueOf(newNum); int tempLoop = tempStr.length() / 2; for(int i=0; i < tempLoop; i++){ //System.out.println(tempStr.subSequence(i, i+1).toString() + "__" + tempStr.subSequence(tempStr.length()-i-1, tempStr.length()-i).toString()); if(!tempStr.subSequence(i, i+1).toString().equals(tempStr.subSequence(tempStr.length()-i-1, tempStr.length()-i).toString())){ return false; } } if(calcNumTotal(newNum)!=calcNumTotal(oldNum)){ return false; } return true; } /** * 统计所有满足条件的回文数 * @param total * @param oldNum */ public static void calcHuiWenNum(int total, int oldNum){ int tempLoop = total / 2; for(int i = 1; i < tempLoop; i++){ int index = 1; int temp = total - 2 * i; calcHuiWenDetail(temp, i, oldNum); } } /** * 递归拆分当前传递的temp变量,取出满足条件的数字拼接之后匹配是否回文数 * @param temp * @param i * @param oldNum */ public static void calcHuiWenDetail(int temp, int i, int oldNum){ if(temp >= 0){ if(temp>9){ //大于9就会出问题,组成x的所有数字之和与组成y的所有数字之和不相等 //这里还需要做处理,但是不会啊!! } String jiaVal = ""; for(int j=0; j<i; j++){ jiaVal += String.valueOf(i); } String newNum = jiaVal + String.valueOf(temp) + jiaVal; //System.out.println("newNum:" + newNum); if(newNum.length()>9){ //如果超过2的31次方就会报转换出错! return; } if(isHuiWenNum(Integer.valueOf(newNum).intValue(),oldNum)){ System.out.println(newNum + ": 回文数!"); huiwenCount++; } int temp_1 = temp - 2 * i; calcHuiWenDetail(temp_1, i, oldNum); //如果temp_1大于等于0就表示可以继续拆分。 //这里还有一个问题,回文数都是成双成对的,比如12321满足,同样21312也满足,可是目前还没有实现。 } } }
目前测试发现的问题有:
<1>在从最大数开始拆分的时候,被拆分的数如果大于9,组成x的所有数字之和与组成y的所有数字之和不相等,并且这个时候被拆分数仍旧可以继续拆分,这部分现在还没做处理;
<2>在递归拆分的时候考虑不周全,没有把所有的拆分元素加进去,而是通过下标完成的,比如添加的都是11、 22、 33等等元素 ;
<3>这里还有一个问题,回文数都是成双成对的,比如12321满足,同样21312也满足,可是目前还没有实现。
3、简单效果
<1>输入999,效果如下:<2>输入234,效果如下:
<3>输入3,效果如下:
<4>输入11,效果如下:
相关文章推荐
- 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 例如: 输入:3+8×2/9-2 输出:2
- 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 例如: 输入:3+8×2/9-2 输出:2
- 安卓根据身高计算标准体重,限制输入非数字的代码
- 输入一个10进制数字,请计算该数字对应二进制中0的个数,注意左数第一个1之前的所有0都不需要计算。不需要考虑负数的情况。
- 输入一个表达式,没有括号,数字小于0-9之间,输出计算结果,所有的中间结果化为整形。 例如: 输入:3+8×2/9-2 输出:2
- C#根据输入的数字计算 4 位数的标识串!
- 奇妙的算法—怎么计算一段连续数字的所有约数的和
- 计算系统输入文件内各行数字的和
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一
- 根据输入数字串,返回连续的数字组合,比如输入“1,2,3,5,6,9”返回“1-3;5-6;9” Delphi6实现(方法2)
- 编写程序,当程序运行后,根据屏幕提示输入一个数字字符串,输入后统计有多少个偶数数字和奇数数字。
- 输出一个整数的每一位,计算1/1-1/2+1/3-1/4+1/5 …… + 1/99 - 1/100 的值,编写程序数一下 1到 100 的所有整数中出现多少次数字 9
- 根据需求输入金额,跳出全数字键盘,最多可输入两位小数,若输入数字大于可提现金额,则默认变更为最大可提现金额。
- 根据输入的日期计算该日期的农历天干地支及当年属相
- 运输公司对用户计算运费.路程越远每公里运费越低.每公里每吨货物的基本运费p = 3;用户需要输入货物重量w和距离s;根据距离的不同折扣d不同(具体见)下面的表格,要求根据用户输入的w和s,计算出总运费
- ASp.net 文本框(TextBox)计算,判断输入的是否是数字
- PHP 输入一棵二叉树和一个数字n,要求找出路径和为n的所有路径
- EditText输入数字做计算时的优化
- 使用c语言编写程序,从键盘上任意输入两个数字,并计算出两个数的最小公倍数
- 计算随机输入数字的平均值