杭州电子科技大学Online Judge 之 “水仙花数(ID2010)”解题报告
来源:互联网 发布:小米路由器 数据分析 编辑:程序博客网 时间:2024/05/18 10:01
杭州电子科技大学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;}}}}
- 杭州电子科技大学Online Judge 之 “水仙花数(ID2010)”解题报告
- 杭州电子科技大学Online Judge 之 “漂浮的气球(ID1004)”解题报告
- 杭州电子科技大学Online Judge 之 “确定比赛名次(ID1285)”解题报告
- 杭州电子科技大学Online Judge 之 “最大连续子序列(ID1231)”解题报告
- 杭州电子科技大学 Online Judge 之 “Max Sum PlusPlus(ID1024)”解题报告
- 杭州电子科技大学 Online Judge 之 “杨辉三角(ID2032)”解题报告
- 北京大学Online Judge 之 “求高精度幂(ID1001)”解题报告
- 九度Online Judge解题报告
- (解题报告)HDU2010---水仙花数
- HUST ACM/ICPC Online Judge Problem 1010--解题报告
- 习题2-1 水仙花数 解题报告
- 杭州电子科技大学(HDU)ACM 刷题---------字符串处理之1062
- 杭州电子科技大学程序设计竞赛(2016’12)
- 水仙花数程序报告
- 【解题报告】BUPT Online Judge Volume 9 Problem 1805 Segments【计算几何】(水题。因为不会用叉积做,自玩了无数次才AC)
- hdu 4419 Colourful Rectangle 杭州赛区 1010 (解题报告)
- 杭州电子科技大学ACM 1001
- 杭州电子科技大学ACM 1018
- vi中添加注释
- Best Time to Buy and Sell Stock I && II && III
- 一个异常
- 线性表之多项式乘法
- HDU 1242 Rescue(广搜)
- 杭州电子科技大学Online Judge 之 “水仙花数(ID2010)”解题报告
- Java基础回顾(2)
- Socket与ServerSocket交互过程
- 水池数目
- 改变
- 处女贴
- oracle llinux 6.4 install oracle 11g
- Android 屏幕适配
- 通过nginx搭建hls流媒体服务器