求21位数的水仙花数

/*
 * 求21位数的水仙花数
 */
import java.math.BigInteger;

public class Demo01_BigInteger {
	// 求 每个 i 的 21 次方
	public static BigInteger p(int i){
		BigInteger base = BigInteger.valueOf(i);
		return base.pow(21);
	}
	public static void ji_suan(BigInteger[] pw,int[] nn){
		BigInteger sum = BigInteger.ZERO;
		for(int i=0;i<10;i++){
			sum = sum.add(
					pw[i].multiply(BigInteger.valueOf(nn[i])));
		}
		String s = "" + sum;
		if(s.length()!=21) return;
		// 确定各数字出现的多少次
		int[] nn2 = new int[10];
		for(int i=0;i<21;i++){
			nn2[s.charAt(i)-'0']++;
		}
		for(int i=0;i<10;i++){
			if(nn[i]!=nn2[i]) return;
		}
		System.out.println(s);
	}
	public static void f(BigInteger[] pw, int[] nn, int cur, int use){
		if(cur==9){
			nn[9] = 21 - use;
			ji_suan(pw,nn);
			return;
		}
		// 对当前位置所有可能进行枚举
		for(int i=0;i<21-use;i++){
			nn[cur] = i;
			f(pw,nn,cur+1,use+i);
		}
	}
	public static void main(String[] args){
		long startTime = System.currentTimeMillis();	// 程序开始时间
		BigInteger pw[] = new BigInteger[10];
		for(int i=0;i<pw.length;i++){
			pw[i] = p(i);
		}
		int nn[] = new int[10];
		f(pw,nn,0,0);
		System.out.println("OK");
		long endTime = System.currentTimeMillis();	// 程序结束时间
		System.out.println((endTime-startTime)/1000f+"秒");	// 运行总时间
	}
}
运行结果:
128468643043731391252
449177399146038697307
OK
27.343秒

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值