蓝桥杯:花朵数

本文介绍了一种高效算法,用于寻找21位花朵数,即一个21位的整数,其各个位数字的21次方之和恰好等于该数本身。通过递归方法遍历可能的数字组合,并验证每个组合是否符合条件。

花朵数:花朵数是指一个数的各个位数的该数的位数次方相加等于该数本身

例:153=1^3+5^3+3^3

程序的任务是:求N=21时,所有满足条件的花朵数。注意:这个整数有21位,它的各个位数字的21次方之和正好等于这个数本身。

代码如下:

 

public class Main{
	private static BigInteger base[] = new BigInteger[10];
	
	public static BigInteger calcu_21(int n) {
		BigInteger a = BigInteger.ONE;
		for(int i=0; i<21; i++) a= a.multiply(BigInteger.valueOf(n));
		return a;
	}
	
	public static void test(int[] a) {
		BigInteger b = BigInteger.ZERO;
		for(int i=0; i<10; i++) {
			b  = b.add(base[i].multiply(BigInteger.valueOf(a[i])));
		}
		String b1 = b.toString();
		if (b1.length()!=21) return;
		int[] b2 = new int[10];
		for(int i=0; i<b1.length(); i++) {
			b2[b1.charAt(i)-'0']++;
		}
		for(int i=0; i<b2.length; i++) {
			if (a[i] != b2[i]) return;
		}
		System.out.println(b1);
	}
	
	public static void f(int[] a, int k, int sum) {
		if (k==a.length-1) {
			a[k] = sum;
			test(a);
			return ;
		}
		for(int i=0; i<sum; i++) {
			a[k] = i;
			f(a, k+1, sum-i);
			a[k] = 0;
		}
	}
	
	public static void main(String[] args) {
		for (int i=0; i<10; i++) base[i] = calcu_21(i);
		int[] a = new int[10];
		f(a, 0, 21);
	}
}

 

这个题的思路是这样的:暴力的去枚举是不行的,因为数量级太大了。因此想到的是:

可以先计算出0~9的21次方分别是什么,放到数组base中。再建立一个a数组,存放的是

在要求的21位数中,0~9分别出现了多少次。这里是使用递归(f函数)来遍历a数组的所有取值的。

当达到了21个数的时候,利用test方法计算这个21位数是否符合要求。b2数组和a数组一样,不过它是求已经得到的21位数中各个数字出现的次数,然后与a数组进行比较,相等说明这个数字符合要求。

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值