妈的果然让我做出来了, 我的特等奖啊啊啊啊啊啊啊啊啊
2010-09-02 14:12
253 查看
/** * 求21位的水仙花数, 一分钟内算出答案 */ import java.math.BigInteger; import java.util.Arrays; public class ArmstrongNumber { static class BigNumber { // 保存0到9的n次方结果 static int[][] nPower = new int[10][]; static { for( int i = 0; i < 10; i++ ) { BigInteger bi = new BigInteger(Integer.toString(i)); char[] powNum = bi.pow(n).toString().toCharArray(); // 把 String 转成 int 数组 nPower[i] = new int[powNum.length]; for( int j = 0; j < nPower[i].length; j++ ) nPower[i][j] = powNum[nPower[i].length - j - 1] - '0'; } } int[] innerNum = new int ; // 用数组以表示大数 // 与另一个大数相加, 如果结果的位数大于n则返回false, 表示此数不是水仙花数 boolean add(int[] addend) { // 数组相加 int len = innerNum.length < addend.length ? innerNum.length: addend.length; for( int i = 0; i < len; i++ ) innerNum[i] += addend[i]; // 进位处理 for( int i = 0; i < innerNum.length - 1; i++ ) if( innerNum[i] >= 10 ) { innerNum[i] -= 10; innerNum[i + 1]++; } // 返回最高位是否在范围内 return innerNum[innerNum.length - 1] < 10; } // 判断两个数组包含的数字是否一样 public boolean equals(int[] a) { int[] aCount = new int[10]; for( int i : a ) aCount[i]++; int[] numCount = new int[10]; for( int i : innerNum ) numCount[i]++; return Arrays.equals(aCount, numCount); } // 判断此数字组合是否能组成水仙花数 boolean isSxNum(int[] a) { for( int n : a ) if( !add(nPower ) ) return false; return equals(a) && innerNum[innerNum.length - 1] != 0; } @Override public String toString() { StringBuilder builder = new StringBuilder(); for( int i = innerNum.length - 1; i >= 0; i-- ) builder.append(innerNum[i]); return builder.toString(); } } static int n = 21; public static void main(String[] args) { System.out.println("开始.."); int[] a = new int ; long start = System.currentTimeMillis(); traverse(a, 0, a.length); long end = System.currentTimeMillis(); System.out.println((end - start) / 1000.0 + "秒"); } // 列举出n位所能包含的所有数字组合, 多重循环的递归实现 static void traverse(int[] a, int start, int layer) { if( layer == 0 ) { BigNumber num = new BigNumber(); if( num.isSxNum(a) ) System.out.println(num); return; } layer--; for( int i = start; i <= 9; i++ ) { // System.out.println(layer+","+i); a[layer] = i; traverse(a, i, layer); } } }
相关文章推荐
- VBS弹出来的对话框如何置顶!--果然技巧
- 对于irrlicht由ISceneManager创建出来的对象dynamic_cast失效的看法RuntimeError: Access violation - no RTTI data
- JSP get方法取出来的参数就变成null了
- 最最重要的内功是长期学习所磨练出来的自学能力(转载)
- 1016: 写出来吧
- s5pv210 方案出来了
- 一个RecyclerView写出来的小Demo
- 用于显示距离当前时间间隔的asp函数,有不足的地方麻烦指出来,谢谢
- 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和
- wince编译出来的eboot.bin的镜像长度为0
- 前台页面填写5天的数据,后台查询出来的数据(大于0,但小于5),将缺少的数据补写
- 创建utf-8文件,并且向里面写数据,在读出来
- [置顶] 今天是个值得纪念的日子 -- 子辰儿子出来了
- GCT的考试成绩终于出来了!
- wireshark 导出所有filter出来的包
- 装修后才知道的79件事,无数网友砸出来的经验(转)
- Delphi 编译出来的程序被小红伞报病毒 TR/Spy.Banker.Gen4 [trojan]
- 写了一个端口映射工具, 代码贴出来下
- 查询两个表中不同(相同)的数据,并把它们显示出来
- 两个程序员的对话折射出来的病态社会