java 21位水仙花数_21位水仙花数用java实现

import java.math.*;

import java.util.HashMap;

public class Test11

{

private int size = 0;//位数

private BigInteger MAX = null;

private BigInteger MIN = null;

HashMap hm = null;//用来存放0`9的size次方

public Test11(int length)//构造要求的水仙花的位数

{

this.size = length;

this.MAX = new BigInteger("10").pow(length).subtract(BigInteger.ONE);

this.MIN = new BigInteger("10").pow(length - 1);

this.hm = new HashMap();

for (int i = 0; i <= 9; i++)

{

hm.put(i + "n", new BigInteger(i + "").pow(length));

}

}

public static void main(String[] args)

{

long start = System.currentTimeMillis();

Test11 test = new Test11(21);

test.find();

long end = System.currentTimeMillis();

long time = end - start;

System.out.println("运行时间: " + time / 10e3 + "秒!");

}

public void find()

{

BigInteger sum = BigInteger.ZERO;

int a0, a1, a2, a3, a4, a5, a6, a7, a8, a9;//分别是0到9数字出现的次数

for (a9 = 0; a9 <= this.size; a9++)

{

sum = sum.add(this.hm.get("9n").multiply(new BigInteger(a9 + "")));

if (sum.compareTo(MAX) > 0)

break;

for (a8 = 0; a8 <= this.size - a9; a8++)

{

sum = sum.add(this.hm.get("8n").multiply(

new BigInteger(a8 + "")));

if (sum.compareTo(MAX) > 0)

break;

for (a7 = 0; a7 <= this.size - a9 - a8; a7++)

{

sum = sum.add(this.hm.get("7n").multiply(

new BigInteger(a7 + "")));

if (sum.compareTo(MAX) > 0)

break;

for (a6 = 0; a6 <= this.size - a9 - a8 - a7; a6++)

{

sum = sum.add(this.hm.get("6n").multiply(

new BigInteger(a6 + "")));

if (sum.compareTo(MAX) > 0)

break;

for (a5 = 0; a5 <= this.size - a9 - a8 - a7 - a6; a5++)

{

sum = sum.add(this.hm.get("5n").multiply(

new BigInteger(a5 + "")));

if (sum.compareTo(MAX) > 0)

break;

for (a4 = 0; a4 <= this.size - a9 - a8 - a7 - a6

- a5; a4++)

{

sum = sum.add(this.hm.get("4n").multiply(

new BigInteger(a4 + "")));

if (sum.compareTo(MAX) > 0)

break;

for (a3 = 0; a3 <= this.size - a9 - a8 - a7

- a6 - a5 - a4; a3++)

{

sum = sum.add(this.hm.get("3n").multiply(

new BigInteger(a3 + "")));

if (sum.compareTo(MAX) > 0)

break;

for (a2 = 0; a2 <= this.size - a9 - a8 - a7

- a6 - a5 - a4 - a3; a2++)

{

sum = sum

.add(this.hm

.get("2n")

.multiply(

new BigInteger(

a2 + "")));

if (sum.compareTo(MAX) > 0)

break;

for (a1 = 0; a1 <= this.size - a9 - a8

- a7 - a6 - a5 - a4 - a3 - a2; a1++)

{

sum = sum.add(this.hm.get("1n")

.multiply(

new BigInteger(a1

+ "")));

if (sum.compareTo(MAX) > 0)

break;

{

a0 = this.size - a9 - a8 - a7

- a6 - a5 - a4 - a3

- a2 - a1;

if (sum.compareTo(MAX) < 0

&& sum.compareTo(MIN) > 0)

check(sum.toString(), a0,

a1, a2, a3, a4, a5,

a6, a7, a8, a9);

}

sum = sum.subtract(this.hm

.get("1n").multiply(

new BigInteger(a1

+ "")));

}

sum = sum

.subtract(this.hm

.get("2n")

.multiply(

new BigInteger(

a2 + "")));

}

sum = sum.subtract(this.hm.get("3n")

.multiply(new BigInteger(a3 + "")));

}

sum = sum.subtract(this.hm.get("4n").multiply(

new BigInteger(a4 + "")));

}

sum = sum.subtract(this.hm.get("5n").multiply(

new BigInteger(a5 + "")));

}

sum = sum.subtract(this.hm.get("6n").multiply(

new BigInteger(a6 + "")));

}

sum = sum.subtract(this.hm.get("7n").multiply(

new BigInteger(a7 + "")));

}

sum = sum.subtract(this.hm.get("8n").multiply(

new BigInteger(a8 + "")));

}

sum = sum.subtract(this.hm.get("9n").multiply(

new BigInteger(a9 + "")));

}

}

public static void check(String str, int a0, int a1, int a2, int a3,

int a4, int a5, int a6, int a7, int a8, int a9)//判斷0到9出現的次數是否吻合sum結果中的

{

String temp = str;

if (a0 == count(temp, "0") && a1 == count(temp, "1")

&& a2 == count(temp, "2") && a3 == count(temp, "3")

&& a4 == count(temp, "4") && a5 == count(temp, "5")

&& a6 == count(temp, "6") && a7 == count(temp, "7")

&& a8 == count(temp, "8") && a9 == count(temp, "9"))

System.out.println(str);

}

public static int count(String str1, String str2)//統計sum中0到9出現的次數

{

String temp1 = str1;

String temp2 = str2;

int k = -1, count = 0;

while (true)

{

k = temp1.indexOf(temp2, k + 1);

if (k != -1)

count++;

else

break;

}

return count;

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值