杭州电子科技大学Online Judge 之 “水仙花数(ID2010)”解题报告

杭州电子科技大学Online Judge 之 “水仙花数(ID2010)”解题报告

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo

Problem Description

水仙花数

春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:

“水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。

现在要求输出所有在m和n范围内的水仙花数。

Input

输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999)。

Output

对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,

则要求从小到大排列在一行内输出,之间用一个空格隔开;

如果给定的范围内不存在水仙花数,则输出no;

每个测试实例的输出占一行。

Sample Input

100 120

300 380

Sample Output

no

370 371

算法分析:

本题是穷举法的典型应用。只需要遍历m-n的所有整数,将该整数拆分成3个数字,然后判断是否满足水仙花数的特征即可。本题的亮点在于对输出格式的控制方法。

说明:

算法思想:穷举法,循环。

数据结构:基本数据类型,。

时间复杂度: O(n-m);


12282615


2014-11-23 20:46:10


Accepted


2010


0MS


248K


552 B


C


巧若拙

代码如下:

#include<stdio.h>
#include<stdlib.h>

void DaffodilNumber(int m, int n);//穷举法求水仙花数

int main(void)
{
   	int m, n;

   	while (scanf("%d%d", &m, &n) != EOF)
	{
		DaffodilNumber(m, n);//穷举法求水仙花数
   	}

    return 0;
}

void DaffodilNumber(int m, int n)//穷举法求水仙花数
{
	int a, b, c, i, flag = 0;

	for (i=m; i<=n; i++)
	{
		a = i / 100;
		b = (i/10)%10;
		c = i % 10;
		if (i == a*a*a + b*b*b + c*c*c)
		{
			printf(flag ? " %d" : "%d", i);
			flag = 1;
		}
	}
	printf(flag ? "\n" : "no\n");
}

补充说明:

其实这道题真是一道水题,我写这篇解题报告的目的是为了引出更难的一道:

题目描述:

水仙花数是指一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身。例 如:153 = 1^3 + 5^3+ 3^3。

本题要求编写程序,计算所有N位水仙花数。

输入格式:

输入在一行中给出一个正整数N(3<=N<=7)。

输出格式:

按递增顺序输出所有N位水仙花数,每个数字占一行。

输入样例:

3

输出样例:

153

370

371

407

算法分析:

本题是穷举法的典型应用。我们可以设置一个数组来存储每一位数字,然后采用深度优先搜索(类似穷举全排列的方法),组合出每一个n位数,然后判断其是否为水仙花数。我实现了递归和非递归两种算法,并对求幂的算法进行了优化。奇怪的是非递归算法竟然比递归算法还要慢,真是不得其解,还望大牛指点。

说明:

算法思想:穷举法,深度优先搜索

数据结构:数组。

时间复杂度: O(10^n);

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include <time.h>

int Num[10] = {0};

void dfs(int top, int n);//回溯法求水仙花数
int pow(int a, int n);//递归法求幂
void DaffodilNumber(int n);//穷举法求水仙花数(非递归) 

int main(void)
{
	clock_t start, finish;
   	double  duration;
   	int i, n;

   	scanf("%d", &n);
   	start = clock();
   	for (i=1; i<10; i++) //回溯法求水仙花数,最高位不能为0
	{
		Num[0] = i;
		dfs(1, n);
	}
	finish = clock();
   	duration = (double)(finish - start) / CLOCKS_PER_SEC;
   	printf( "%f seconds\n", duration );  

   	start = clock();
   	DaffodilNumber(n);//穷举法求水仙花数(非递归)
   	finish = clock();
   	duration = (double)(finish - start) / CLOCKS_PER_SEC;
   	printf( "%f seconds\n", duration );  

    return 0;
}

void dfs(int top, int n)//回溯法求水仙花数
{
	int i, s1, s2;

	if (top == n)
	{
		s1 = s2 = 0;
		for (i=0; i<n; i++)
		{
			s1 += pow(Num[i], n);
			s2 = s2 * 10 + Num[i];
		}
		if (s1 == s2)
		{
			for (i=0; i<n; i++)
				printf("%d", Num[i]);
			printf("\n");
		}
		return ;
	}

	for (i=0; i<10; i++)
	{
		Num[top] = i;
		dfs(top+1, n);
	}
}

int pow(int a, int n)//递归法求幂
{
	int s;

	if (a == 0 || a == 1 || n == 1)
		return a;
	if (n == 0)
		return 1;

	s = pow(a, n/2);

	return (n%2 == 0) ? (s * s) : (s * s * a);
}

void DaffodilNumber(int n)//穷举法求水仙花数(非递归)
{
	int i, j, top, s1, s2;

	for (i=1; i<10; i++)
	{
		Num[0] = i;
		Num[1] = -1;
		top = 1;
		while (top > 0)
		{
			if (top == n)
			{
				s1 = s2 = 0;
				for (j=0; j<n; j++)
				{
					s1 += pow(Num[j], n);
					s2 = s2 * 10 + Num[j];
				}
				if (s1 == s2)
				{
					for (j=0; j<n; j++)
						printf("%d", Num[j]);
					printf("\n");
				}
				--top; //返回上一个数字
			}
			else if (Num[top] < 9)
			{
				Num[top++]++;
				Num[top] = -1;
			}
			else
			{
				--top;
			}
		}
	}
}
时间: 2024-10-01 03:33:33

杭州电子科技大学Online Judge 之 “水仙花数(ID2010)”解题报告的相关文章

杭州电子科技大学Online Judge 之 “确定比赛名次(ID1285)”解题报告

杭州电子科技大学Online Judge 之 "确定比赛名次(ID1285)"解题报告 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) Problem Description 有N个比赛队(1<=N<=500).编号依次为1,2,3,.....N进行比赛.比赛结束后.裁判委员会要将全部參赛队伍从前往后依次排名. 但如今裁判委员会不能直接获得每一个队的比赛成绩,仅仅知道每场比赛的结果.即P1赢P2,用P1.P2表示,排名时P

杭州电子科技大学 Online Judge 之 “杨辉三角(ID2032)”解题报告

杭州电子科技大学 OnlineJudge 之 "杨辉三角(ID2032)"解题报告 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) Problem Description 还记得中学时候学过的杨辉三角吗?具体的定义这里不再描述,你可以参考以下的图形: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 Input 输入数据包含多个测试实例,每个测试实例的输入只包含一个正整数n(1<=n<

杭州电子科技大学Online Judge 之 “漂浮的气球(ID1004)”解题报告

巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 题目描述: Let the Balloon Rise Problem Description Contest time again! How excited it is tosee balloons floating around. But to tell you a secret, the judges' favoritetime is guessing the most popular pro

杭州电子科技大学程序设计竞赛(2016’12)- 网络同步赛 1002

递增数 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 0    Accepted Submission(s): 0 Problem Description 若一个正整数 A,相邻位总是满足低位大于等于高位,则称之为递增数.例如:1223,667 等都是递增数.现在有个正整数 X,请问有多少个正整数 A 满足 1<=A<=X,且 A 为

【杭州电子科技大学2018新生编程大赛题解】

01: 1 #include<cstdio> 2 #include<cstring> 3 #include<string> 4 #include<cmath> 5 #include<iostream> 6 #include<algorithm> 7 #include<map> 8 #include<set> 9 #include<queue> 10 #include<vector> 11

2017华为机试题--水仙花数

等了一个月终于等到华为给安排的实习生在线机试,把自己做的三道题记录了一下,也方便日后复习.这篇是第一题,没有什么特别的难度,经典的水仙花数题. 题目描述:水仙花数是指一个n位数(n≥3),它的每个位上的数字的n次幂之和等于它本身.(例如:13+53+33=153),要求:输出1000范围内所有水仙花数及水仙花数之和. 输入描述:无 输出描述:1000以内所有水仙花数及总和. 输出例子: 第1个水仙花数:xxx 第2个水仙花数:xxx 第3个水仙花数:xxx ... 水仙花数总和为:xxx 1 p

Java练习 SDUT-1239_水仙花数

水仙花数 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,是这样定义的: "水仙花数"是指一个三位数,它的各位数字的立方和等于其本身,比如:153=13+53+33. 现在要求输出所有在m和n范围内的水仙花数. Input 输入数据有多组,每组占一行,包括两个整数m和n(100<=m<=n<=999). Output 对于每

筛选水仙花数

//水仙花数--个位的平方+十位的平方+百位的平方(等于==)该三位数 #include<stdio.h>int main(){ int ge,shi,bai; //从100开始筛选for(int i=100;i<1000;i++){ ge=i%10; shi=i/10%10; bai=i/100%10; if(a==ge*ge*ge+shi*shi*shi+bai*bai*bai){//水仙花数的判断条件 //输出 printf("%d\t",i); }} retu

js算法集合(一) 水仙花数 及拓展(自幂数的判断)

js算法集合(一) ★ 最近有些朋友跟我说对js中的一些算法感到很迷惑,知道这个算法到底是怎么回事,但是就是不会用代码把它写出来,这里我跟大家分享一下做水仙花数的算法的思路,并对其扩展到自幂数的算法,希望能对大家有所帮助. 1.验证一个数是否为水仙花数 ①要写水仙花数的算法,我们首先来了解一下什么是水仙花数,水仙花数是指一个 3位正整数 ,它的每个位上的数字的 3次幂之和等于它本身.(例如:1^3 + 5^3+ 3^3 = 153): ②了解了什么是水仙花数我们就开始分析该怎么下手.通过定义来看