xavier 2007-11-3 15:36
雷劈数系列一(11.17更新)
[b]雷劈数是什么?[/b]
有位数学家叫卡普利加,在一次旅行中,遇到猛烈的暴风雨,电闪雷鸣过后,他看到路边一块里程碑,被雷电劈成两半,一半上刻著30,另一半刻著25。这时,卡普利加的脑际中忽然发现了一个绝妙的数学关系——把劈成两半的数加起来,再平方,正好是原来的数。这样的数就是雷劈数了
先来写一个方法判断一个数是不是雷劈数吧
[code]
def thund_number?(num)
end
[/code]
注意雷是不可以把数劈成两半的,我们的ruby也不能。但雷能劈开刻在石碑上的"数字",所以我们也要把数字转化成字符串才可以。
还有,凭直觉,这过程中肯定是要多次用到这个字符串的长度,所以我们把它也写出来
[code]
def thund_number?(num)
str = num.to_s
n = str.length
end
[/code]
雷不是每次都能那么准的从中间把数劈开。3025,如果从3和0之间劈就不符合我们的条件。再比如100(10+0=10;10**2=100),假如把他劈成1和00,那它也不符合了,所以我们要把所有的情况都考虑到
其实无非就是这个数有n位,我们就有n-1种情况需要考虑,据此:
[code]
def thund_number?(num)
str = num.to_s
n = str.length
0.upto(n - 1) do |i|
return true if (str[0,i+1].to_i + str[i+1,n - 1].to_i)**2 == num
end
end
[/code]
这样就能运行了,但是好像还缺点什么。假如他不是雷劈数,我们要返回false
还有,实际上用到的是位数-1而不是位数
[code]
def thund_number?(num)
str = num.to_s
n = str.length - 1
0.upto(n) do |i|
return true if (str[0,i+1].to_i + str[i+1,n].to_i)**2 == num
end
return false #return是可以省略的,但是为了便于理解,还是加上了
end
[/code]
来试验一下
[code]
thund_number?(81) #=true
thund_number?(2025) #=true
......
[/code]
[[i] 本帖最后由 xavier 于 2007-11-17 09:32 编辑 [/i]]
maninred 2007-11-3 17:01
有趣的题目,好像以前刚刚学编程的时候还有一个叫做水仙花数的。
drive2me 2007-11-4 15:17
最年轻的版主,谢谢努力工作。
有趣的案例,还有个有意思的故事呢,来劲!
人脑的思维太伟大了,无与伦比!
drive2me 2007-11-4 15:18
[quote]原帖由 [i]maninred[/i] 于 2007-11-3 17:01 发表 [url=http://ruby-lang.org.cn/forums/redirect.php?goto=findpost&pid=7080&ptid=1844][img]http://ruby-lang.org.cn/forums/images/common/back.gif[/img][/url]
有趣的题目,好像以前刚刚学编程的时候还有一个叫做水仙花数的。 [/quote]
那你还记得水仙花数的故事吗?
有空来讲讲吧。我没有听过呢。
xnine 2007-11-16 17:38
此题涉及 一个Fixnum类 的to_s方法
String类 的to_i 方法
length方法
[]方法(从第一个参数的值开始取然后取到第二个参数的值)
然后 用了一次迭代 upto
恩 解读完毕
xavier 2007-11-16 19:02
[quote]原帖由 [i]xnine[/i] 于 2007-11-16 17:40 发表 [url=http://ruby-lang.org.cn/forums/redirect.php?goto=findpost&pid=7974&ptid=1844][img]http://ruby-lang.org.cn/forums/images/common/back.gif[/img][/url]
好象少点东西 如果是10以下的数没有判断。。。 [/quote]
这倒是个问题。
xnine 2007-11-17 09:18
可不可以在先判断下传过的num
if num>=10
...
end
xavier 2007-11-17 09:22
0和1竟然返回true.....
不过你看看二,就知道,我们根本没有往里传10以下的数。
最小的雷劈数是81
[[i] 本帖最后由 xavier 于 2007-11-17 09:27 编辑 [/i]]
xnine 2007-11-17 10:00
str[0,i+1].to_i + str[i+1,n].to_i
这个应该就是 如何劈了吧?但是不能读懂,能那100当例子给讲解下吗?
现在理解的很模糊的思想
如果是100 迭代就是从0到2
然后呢?
第一次是 1+00?
第二次是 10+0?
第三次呢???超出了?
[[i] 本帖最后由 xnine 于 2007-11-17 10:03 编辑 [/i]]
loki 2008-1-15 11:43
ruby的语法真不习惯
不过貌似用起来很方便
哦也
我喜欢~
顺便问一句
方法名后面的!和?分别代表什么意思
xavier 2008-2-18 18:54
[quote]原帖由 [i]loki[/i] 于 2008-1-15 11:43 发表 [url=http://www.ruby-lang.org.cn/forums/redirect.php?goto=findpost&pid=10485&ptid=1844][img]http://www.ruby-lang.org.cn/forums/images/common/back.gif[/img][/url]
顺便问一句
方法名后面的!和?分别代表什么意思 [/quote]
加!的方法是说这个方法会改变它的调用者,提醒你注意
加?的方法是说这个方法返回true或false
jmouse 2008-2-29 14:10
水仙花数的意思是该数等于其所有真约数之和。
真约数就是除了自己之外的约数。
比如6=1+2+3