【学习笔记】蓝桥杯 花朵数(21位水仙花数)

一个N位的十进制正整数,如果它的每个位上的数字的N次方的和等于这个数本身,则称其为花朵数。
例如:
当N=3时,153就满足条件,因为 1^3 + 5^3 + 3^3 = 153,这样的数字也被称为水仙花数(其中,“^”表示乘方,5^3表示5的3次方,也就是立方)。
当N=4时,1634满足条件,因为 1^4 + 6^4 + 3^4 + 4^4 = 1634。
当N=5时,92727满足条件。

实际上,对N的每个取值,可能有多个数字满足条件。

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

跑的巨慢,用时三分多点,不满足题目的一分钟要求了,但还是求出来了,想办法优化下也许能达到要求

import java.math.BigInteger;
import java.util.Arrays;

public class test{
	public static void main(String[] args) {
		num[0] = 21;
		for(int i = 1;i < 10;i++){
			num[i] = 0;
		}
		new recursive(num,0,21);
	}
	static int[] num = new int[10];
	static class recursive{
		int[] num;
		int size;
		int loc;
		recursive(int[] num,int loc,int size){
			this.num = num;
			this.loc = loc;
			this.size = size;
			this.search();
		}
		void search() {
			if(loc == 10){
				end();
				return;
			}
			if(size == 0){
				end();
				return;
			}
			for(int i = 0; i < size;i++){
				int[] inNum = num;
				inNum[loc] = i;
				new recursive(inNum,loc+1,size-i);
			}
		}
		void end(){
			BigInteger sum = new BigInteger("0");
			BigInteger ten = new BigInteger("10");
			int[] inNum = new int[21];
			int loction = 0;
			for(int i = 0;i < 10;i++){
				BigInteger mult = new BigInteger(num[i]+"");
				for(int j = 0;j < num[i];j++){
					inNum[loction++] = i;
				}
				BigInteger nums = new BigInteger(i + "");
				sum = sum.add(nums.pow(21).multiply(mult));
			}
			if(sum.compareTo(ten.pow(20)) > 0 && sum.compareTo(ten.pow(21)) < 0){
				int[] enSum = new int[21];
				for(int i = 0;i < 21;i++){
					String place = sum.toString();
					if(i < place.length()){
						enSum[i] = Integer.parseInt((sum.toString().charAt(i)+""));
					}else{
						enSum[i] = 0;
					}
				}
//				System.out.println(sum);
//				System.out.print("enSum[]:");
//				for(int i = 0;i < 21;i++){
//					System.out.print(enSum[i]);
//				}
//				System.out.println();
				Arrays.sort(enSum);
				Arrays.sort(inNum);
//				System.out.print("inNum[]:");
//				for(int i = 0;i < 21;i++){
//					System.out.print(inNum[i]);
//				}
//				System.out.println();
				if(Arrays.equals(enSum,inNum)){
					System.out.println(sum);
				}
			}
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值