免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2933 | 回复: 9

哪位大侠会算这个呀?? 指点一二,谢谢 [复制链接]

论坛徽章:
0
发表于 2011-08-18 09:50 |显示全部楼层
题目如下,重点是程序在3分钟之内计算完毕。

求详细代码和解释,请指点一下

一个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分钟内运行完毕

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2011-08-18 10:07 |显示全部楼层
这完全是个数学问题好吧

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-08-18 10:52 |显示全部楼层
回复 1# Kitaisky


    C/C++版上有人问过

论坛徽章:
0
发表于 2011-08-18 14:36 |显示全部楼层
回复 2# zhlong8


回版主的话,是数学问题,Perl的算法我也有一个,但算到第8位就两分半了;求优化:

#!/usr/bin/perl

use strict;
use warnings;

my $now = time;

my $n = shift;
my $start = 10**($n-1)+1;
my $end = 10**$n-1;

my @result;

my %cache;
$cache{$_} = ($_)**$n for (0..9);

for my $number ($start..$end) {

    my $sum = 0;

    for (split '', $number) {
        $sum += $cache{$_};
    }   

    push @result, $number if ($sum == $number);
}

print "For n = $n, the numbers are: ", "@result\n";
print "Time: ", time()-$now, "secs\n";

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
发表于 2011-08-18 14:44 |显示全部楼层
回复  zhlong8


回版主的话,是数学问题,Perl的算法我也有一个,但算到第8位就两分半了;求优化:

...
Kitaisky 发表于 2011-08-18 14:36



    用循环到宇宙毁灭也算不完,所以说是数学问题

论坛徽章:
2
射手座
日期:2014-10-10 15:59:4715-16赛季CBA联赛之上海
日期:2016-03-03 10:27:14
发表于 2011-08-18 15:06 |显示全部楼层
回复 4# Kitaisky


   for 循环的开始可以优化下:
  当$_**$n*$n>10**$n时,从$start=$(n-1) x n开始循环判断;

    可以加个判断结束循环
  last if ($sum >10**$n-1)

论坛徽章:
0
发表于 2011-08-22 17:57 |显示全部楼层

论坛徽章:
0
发表于 2011-08-24 15:29 |显示全部楼层
回复 7# cecial


    谢谢 yinyuemi 和 cecial...

    居然发现:

    for (small_number..large_number) {

      # 有 implementation 的上限;
      # Back to being a C-programmer
}

论坛徽章:
0
发表于 2011-08-26 16:27 |显示全部楼层
换 天河一号  30秒就算出来了

论坛徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龙
日期:2014-08-08 09:28:02狮子座
日期:2014-09-14 20:32:05
发表于 2012-07-18 14:51 |显示全部楼层
本帖最后由 ssfjhh 于 2012-07-18 14:53 编辑

提供个python版的
  1. def narcissistic(n):
  2.     length = len(str(n))
  3.     sumn = sum([int(i)**length for i in list(str(n))])
  4.     if n == sumn:
  5.         return True
  6.     else:
  7.         return False

  8. if __name__ == '__main__':
  9.     for i in range(10000):
  10.         if narcissistic(i):
  11.             print(i)
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP