查看完整版本: 2008-03-24 Ruby 测试题(00005)

jmouse 2008-3-24 01:31

2008-03-24 Ruby 测试题(00005)

今天还是来做点基础的。
输出2个整数(a,b)的最大公约数和最小公倍数。
暂时不考虑溢出以及负数,0的问题。
不知道Math库里是不是已经有轮子在,就算在,也先别用吧。
**** Hidden Message *****

bbschat 2008-3-24 09:37

貌似前两天刚优化过~直接贴答案

**** Hidden Message *****

xavier 2008-3-24 16:51

**** Hidden Message *****

[[i] 本帖最后由 xavier 于 2008-3-25 13:29 编辑 [/i]]

jmouse 2008-3-24 18:24

楼上的试一下puts gcd(24,15)

liumuqing 2008-3-24 18:51

**** Hidden Message *****

我的好长啊。。

liumuqing 2008-3-24 18:56

呜呜 。。没脸活了。。。楼上的都好短。。。。。

jmouse 2008-3-25 01:33

首先,从算法上来讲,求最大公约数没必要把所有质因数都找出来,虽然这是一种方法。但是大数组操作的效率是有问题的。
其次,最大公约数×最小公倍数=两数乘积。
代码上来讲,求质因数的时候没必要把2独立出来。如果确实把2单独写了,那后面那个循环步长就应该是2而不是一。
然后,利用下Ruby的特性,可以把代码也搞得短一点的。
[code]
def get_all_prime_factor(n)
  answer = []
  x = 2
  while n != 1
    if n % x == 0
      n /= x
      answer.push(x)
    else
      x += 1
    end
  end
  return answer
end

def greatest_common_divisor(a, b)
    a_factor = get_all_prime_factor(a)
    b_factor = get_all_prime_factor(b)
    answer = 1
    a_factor.each {|i| answer *= b_factor.delete(i) if b_factor.include?i}
    return answer
end

def lease_common_multiple(a, b)
    a_factor = get_all_prime_factor(a)
    b_factor = get_all_prime_factor(b)
    answer = a * b
    a_factor.each {|i| answer /= b_factor.delete(i) if b_factor.include?i}
    return answer
end

#test
puts greatest_common_divisor(15, 12)
puts lease_common_multiple(12, 15)
[/code]

drive2me 2008-3-25 11:08

[quote]原帖由 [i]liumuqing[/i] 于 2008-3-24 18:56 发表 [url=http://www.ruby-lang.org.cn/forums/redirect.php?goto=findpost&pid=12996&ptid=3898][img]http://www.ruby-lang.org.cn/forums/images/common/back.gif[/img][/url]
呜呜 。。没脸活了。。。楼上的都好短。。。。。 [/quote]

正确,然后优化。不怕,熟能生巧!继续!

love8909 2008-3-25 11:38

**** Hidden Message *****

稍微拓展了一下,求n个数的最大公约数和最小公倍数

myminer 2008-3-26 16:44

**** Hidden Message *****

kukully 2008-4-7 19:39

我还得努力

hexawing 2008-6-8 02:58

试一下下
**** Hidden Message *****
记得小时候我爷爷教过我,“辗转相除法”
我确定名字没记错,虽然没用到除法但真的叫这个名字……

[[i] 本帖最后由 hexawing 于 2008-6-15 09:08 编辑 [/i]]

als 2008-7-7 10:11

试试看

def gcd(a,b)
  a,b = b,a if a<b
  if a%b != 0
    return gcd(b,a%b)
  else
    return b
  end
end

def lcm(a,b)
  return a*b/gcd(a,b)
end

puts gcd(13,48)
puts lcm(13,48)

neohsiao 2008-7-13 17:41

**** Hidden Message *****

[[i] 本帖最后由 neohsiao 于 2008-7-13 17:42 编辑 [/i]]

keymi 2008-8-21 11:34

这题比较简单,呵呵!
**** Hidden Message *****

xiaolin 2008-8-21 12:40

直接来看看答案

acnono 2008-8-21 14:19

[code]**** Hidden Message *****[/code][code]>ruby bbs324.rb
4560
6540
60
497040
>Exit code: 0[/code]

punkpopb 2008-9-26 23:08

比较下算法!呵呵

hellsangel 2008-11-14 23:58

看看答案

看看答案
页: [1]
查看完整版本: 2008-03-24 Ruby 测试题(00005)