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次方之和正好等于这个数本身。

如果满足条件的数字不只有一个,请从小到大输出所有符合条件的数字,每个数字占一行。因为这个数字很大,请注意解法时间上的可行性。要求程序在3分钟内运行完毕。

解题思路: 还是暴力。

import java.math.BigInteger;

/*
 *    21位水仙花数!
 *
 *
 */
public class Asist
{
	static BigInteger hash[] = new BigInteger[10];
	public static void main(String[] args)
 	{
		long t = System.currentTimeMillis();
		// 打表
		table();
       int a1[] = new int[10];
       dfs(a1, 0, 21);
       System.out.println(System.currentTimeMillis()-t + "ms");
 	}

	private static void table()
	{
        for (int i = 0; i < 10; i++)
        {
            hash[i] = pow1(i, 21);
        }
	}

	private static void dfs(int[] a1, int k, int ws)
	{
		if (ws == 0)
		{
			test(a1);
		}
		else if (k == a1.length-1)
		{
			a1[k] = ws;
			test(a1);
		}
		else{
		for (int i = 0; i <= ws; i++)
		{
		    a1[k] = i;
		    dfs(a1, k + 1, ws-i);
		    a1[k] = 0;
		}
		}
	}

	private static void test(int[] a1)
	{
		int b1[] = new int[10];
		BigInteger sum = new BigInteger("0");

		for (int i = 0; i < 10; i++)
		{
			sum = sum.add(hash[i].multiply(new BigInteger(a1[i]+"")));
		}
		if (sum.toString().length() != 21) return;
		char[] c1 = sum.toString().toCharArray();
		for (int i = 0; i < c1.length; i++)
		{
		   	b1[c1[i]-'0']++;
		}
		for (int i = 0; i < 10; i++)
		{
			if (b1[i] != a1[i]) return;
		}
		System.out.println(sum);
	}

	// 求幂
	private static BigInteger pow1(int i, int j)
	{
		BigInteger sum = BigInteger.ONE;
		BigInteger temp = new BigInteger(i+"");
		while(j != 0)
		{
			if ((j & 1) == 1) sum = sum.multiply(temp);
			temp = temp.multiply(temp);
			j >>= 1;
		}
		return sum;
	}
}
</pre><pre name="code" class="java">运行结果:
128468643043731391252
449177399146038697307
63444ms
时间: 2024-12-23 06:38:18

21位水仙花数—题解的相关文章

21位水仙花数(花朵数 )

问题就不描述了,简单说下思路. 思路:(1)暴力枚举21位数,然后一个个的计算,虽然能解,但是,时间不允许的. (2)枚举  0 -9 这10个数子在这个21位数中出现的次数.得到一种解后,再计算出这个21位数,然后与原来得到的解对比,看看0 - 9出现的次数是否一样,是,这个21位数就是一个解.用时不到30s. AC代码: import java.math.BigInteger; /*21位水仙花数 * 枚举每个数字出现的次数 * */ public class T08 { //记录0 - 9

三位水仙花数

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 ;

水仙花数 题解

春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的: “水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3. 现在要求输出所有在m和n范围内的水仙花数. Input输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999).Output对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个

循环-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

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

水仙花数的解法

package cn; import java.lang.reflect.Method; /**  * 三位的水仙花数共有4个:153,370,371,407  *  */ public class DaffodilNumber { public static void main(String[] args) { method1(); /**  *  三位水仙花数是:153  * 三位水仙花数是:370  * 三位水仙花数是:371  * 三位水仙花数是:407  */ System.out.p