您的位置:首页 > 其它

妈的果然让我做出来了, 我的特等奖啊啊啊啊啊啊啊啊啊

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);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐