21位水仙花数(花朵数 )

问题就不描述了,简单说下思路。

思路:(1)暴力枚举21位数,然后一个个的计算,虽然能解,但是,时间不允许的。

(2)枚举  0 -9 这10个数子在这个21位数中出现的次数。得到一种解后,再计算出这个21位数,然后与原来得到的解对比,看看0 - 9出现的次数是否一样,是,这个21位数就是一个解。用时不到30s。

AC代码:

import java.math.BigInteger;

/*21位水仙花数
 * 枚举每个数字出现的次数
 * */
public class T08 {
	//记录0 - 9 这几个数的21次方
	static BigInteger[] num = new BigInteger[10];

	public static void main(String[] args) {
		//算出0 - 9 的21次方
		pf(num);
		//枚举0 - 9出现的个数,存储在count中。
		int[] count = new int[10];

		f(count,0,21);
	}
	public static void f(int[] count,int index,int max)
	{
		if(index == 9)
		{
			count[index] = max;
			//计算结果
			jisuan(count,num);
		}
		else
		{
			for(int i = 0;i<=max;i++)
			{
				count[index] = i;
				f(count,index+1,max - i);
			}
		}
	}
	private static void  jisuan(int[] count,BigInteger[] num) {

		BigInteger ans = new BigInteger("0");
		//算出该状态下的21位数
		for(int i = 0;i<10;i++)
		{
			ans = ans.add(num[i].multiply(new BigInteger(""+count[i])));
		}

		String str = ans.toString();
		//如果不是21位,结束
		if(str.length()!=21)
			return;
		//得到该21位数中 0 - 9 出现的次数
		int[] ans2 = new int[10];
		for(int i = 0;i<21;i++)
		{
			ans2[str.charAt(i) - '0']++;
		}
		//与原来的枚举结果对比
		for(int i = 0;i<10;i++)
		{
			if(ans2[i] != count[i])
				return;
		}
		sop(str);

	}
	private static void sop(String str) {
		System.out.println(str);

	}
	//计算各个数的21次方
	public static void pf(BigInteger[] num)
	{
		for(int i = 0;i<10;i++)
		{
			num[i] = new BigInteger(""+i);
			num[i] = num[i].pow(21);
		}
	}

}
时间: 2024-10-10 16:30:42

21位水仙花数(花朵数 )的相关文章

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

三位水仙花数

1 #include <stdio.h> 2 #include <math.h> 3 4 5 int main() 6 { 7 /*三位水仙花数 8 概念:若三位数ABC满足ABC=A^3+B^3+C^3,则称为三位水仙花数.例如153=1^3+5^3+3^3,所以 153是水仙花数 9 10 实现步骤: 11 1. 输入两个数,表示区间[a,b],由于求解的是三位的水仙花数,所以a>=100,b<=999,且b>a 12 2. 实现算法,设数num,分解百位,十

【华为练习题 】 n位水仙花数(初级)

[华为练习题 ] n位水仙花数(初级) 题目 水仙花数又称阿姆斯特朗数. 水仙花数是指一个n 位数( n≥3 ),它的每个位上的数字的n 次幂之和等于它本身.(例如:1^3 + 5^3 + 3^3 = 153) 求输入的数字是否为水仙花数 解答 #include <iostream> #include <vector> using namespace std; bool isRight(int n){ vector<int> v; int sum = 0, tmp =

多位水仙花数

/** * 水仙花数 * */ public class Daffodil { public static void main(String[] args) { int max = 9999 ; int min = 10 ; for(int x=min;x<max;x++){ String temp = String.valueOf( x ) ; int pow = temp.length() ; char[] chars = temp.toCharArray() ; int all = 0 ;

循环-11. 水仙花数

循环-11. 水仙花数(20) 时间限制 2000 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 徐镜春(浙江大学) 水仙花数是指一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身.例 如:153 = 13 + 53+ 33. 本题要求编写程序,计算所有N位水仙花数. 输入格式: 输入在一行中给出一个正整数N(3<=N<=7). 输出格式: 按递增顺序输出所有N位水仙花数,每个数字占一行. 输入样例: 3 输出样例: 1

Problem03 水仙花数

题目:打印出所有的"水仙花数"."水仙花数"是指一个三位数,其各位数字立方和等于该数本身. 例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方. 程序分析:利用for循环控制100-999个数,每个数分解出个位,十位,百位. 1 public class Problem03 { 2 //打印所有三位水仙花数 3 //水仙花数:是指一个三位数,其各位数字立方和等于该数本身 4 public static void mai

打印出三位数的水仙花数Python

水仙花数计算 ???????????????????????????????????????????????????????????????????????????????????????????????? ???????????????????????????????????????????????????????????????????????????????????????????????? 1.题目描述 “3位水仙花数”是指一个三位整数,其各位数字的3次方和等于该数本身.例如:ABC是一

04-1. 水仙花数(20)

水仙花数是指一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身.例 如:153 = 13 + 53+ 33. 本题要求编写程序,计算所有N位水仙花数. 输入格式: 输入在一行中给出一个正整数N(3<=N<=7). 输出格式: 按递增顺序输出所有N位水仙花数,每个数字占一行. 输入样例: 3 输出样例: 153 370 371 407 注:这里实现了最高7阶的水仙花,用了7个变量保存每一位的n次方结果(当n<7时,后面的几个变量会和0做乘法,所以不会影响<7阶

循环-11. 水仙花数(20)

水仙花数是指一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身.例 如:153 = 13 + 53+ 33. 本题要求编写程序,计算所有N位水仙花数. 输入格式: 输入在一行中给出一个正整数N(3<=N<=7). 输出格式: 按递增顺序输出所有N位水仙花数,每个数字占一行. 输入样例: 3 输出样例: 153 370 371 此题借用他人的算法,十分简短. #include <iostream> #include <stdio.h> #inclu