java 穷举法求水仙花数,杭州电子科技大学Online Judge 之 “水仙花数(ID2010)”解题报告...

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

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

0MS

248K

C

代码如下:

#include

#include

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

#include

#include

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

{

s1 += pow(Num[i], n);

s2 = s2 * 10 + Num[i];

}

if (s1 == s2)

{

for (i=0; 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

{

s1 += pow(Num[j], n);

s2 = s2 * 10 + Num[j];

}

if (s1 == s2)

{

for (j=0; j

printf("%d", Num[j]);

printf("\n");

}

--top; //返回上一个数字

}

else if (Num[top] < 9)

{

Num[top++]++;

Num[top] = -1;

}

else

{

--top;

}

}

}

}

原文:http://blog.csdn.net/qiaoruozhuo/article/details/41418317

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值