查看完整版本: 雷劈数系列二

xavier 2007-11-4 13:05

雷劈数系列二

雷劈数系列一:[url]http://ruby-lang.org.cn/forums/thread-1844-1-1.html[/url]

[b]寻找雷劈数[/b]
我们已经有了判断一个数是不是雷劈数的方法。就可以开始寻找了
假如需要找到100000以内的所有雷劈数,是不是把他们一个一个带进去判断就可以了呢?
[code]
arr=[]
10.upto(100000){|i|arr << i if thund?(i)}    #要把数劈开至少得是两位数,所以从10开始迭代
puts arr.length
p arr

#=>7
#=>[ 81, 100, 2025, 3025, 9801, 10000, 88209]
[/code]
看起来不错,那么找1000000以内的
......
哦不,他太慢了。(我这要一分钟左右)

[b]改进程序[/b]
实际上,最小的雷劈数是81,没有比这再小的了,那么就可以改成从81开始。但是这对运行速度好像没什么影响
再观察一下这些数,嗯...等等,他们都是完全平方数么?
对,根据定义,只有完全平方数才有可能是雷劈数!
我们在迭代的时候只需要完全平方数就可以了,把其他数都忽略掉
[code]
arr=[]
9.upto((1000000**0.5).truncate){|i| arr << (i**2) if thund?(i**2)}
puts arr.length
p arr
[/code]
这下就快多了。

drive2me 2007-11-4 15:22

我们最小的版主(16岁)就能做出如此好的案例,请大家加油。

我们是Ruby精英,你们不认为吗?
如果你不认为是,那你就再加油!!!

大家都能做得很好,那我们一起就做到更好吧!

加油!加油!加油!!!

drive2me 2007-11-4 15:24

[quote]原帖由 [i]xavier[/i] 于 2007-11-4 13:05 发表 [url=http://ruby-lang.org.cn/forums/redirect.php?goto=findpost&pid=7121&ptid=1856][img]http://ruby-lang.org.cn/forums/images/common/back.gif[/img][/url]
雷劈数系列一:[url]http://ruby-lang.org.cn/forums/thread-1844-1-1.html[/url]

寻找雷劈数
我们已经有了判断一个数是不是雷劈数的方法。就可以开始寻找了
假如需要找到100000以内的所有雷劈数,是不是把他们一个一 ... [/quote]

说真的,雷劈数我还是第一次听说,不怕见笑了。
谢谢小X告诉我们这个知识和案例!

xavier 2007-11-4 20:36

哈,我也是偶然在网上看到的~

axgle 2007-11-8 10:15

哈哈,有意思

admin 2007-11-8 10:49

事实上我也没有看过这个数的名字,呵呵。不过看了就懂了! 英雄出少年啊。

xnine 2007-11-17 09:51

1000000**0.5
这样字的定义是什么意思呢/?

xavier 2007-11-17 10:39

就是1000000的平方根

loki 2008-1-15 12:05

果然是英雄出少年
想我16岁的时候还在cs,魔兽呢
荒废了不少时间

顺便问问
truncate方法干什么用的?
p是自定义方法吗?

x116 2008-1-16 09:43

p 相当于 puts
truncate 相当于求整,截断尾数

xavier 2008-1-16 16:39

p和puts还是有区别的
puts 就是输出字符串
而p以字符串的形式输出对象,并尽量保持能让你看出来他的本质
[code]
p "string" => "string"
puts "string" => string

p [1,2,3] => [1,2,3]
puts [1,2,3] =>1
               2
               3
[/code]

[[i] 本帖最后由 xavier 于 2008-1-16 16:41 编辑 [/i]]

jhxhlj 2008-2-1 00:26

很有意思,能否把分开的两个数也打印出来呢:)

antares_sco 2008-2-18 10:40

恩。。。。。好。。。楼主很乐于思考。。顶

jmouse 2008-2-29 17:38

换一种思路
[code]

$arr=[]

def add(n)
    9.step(n,1) {|num|$arr<<num**2 if thund?num}
end

def thund?(number)
    n = number ** 2;
    s = n.to_s;
    len = s.length;
    1.upto(len-1) do |i|
      a = n / (10**i)
      b = n - a * (10 ** i)
      return true if (a+b)**2 == n
    end
    return false
end

add(10000)
puts $arr.length
print $arr.join(", "),"\n"
[/code]

[[i] 本帖最后由 jmouse 于 2008-2-29 17:53 编辑 [/i]]
页: [1]
查看完整版本: 雷劈数系列二