"Van Jacques" <vanjac12 / yahoo.com> schrieb im Newsbeitrag news:70ae81fd.0312141001.40628225 / posting.google.com... > "Robert Klemme" <bob.news / gmx.net> wrote in message news:<brcjq4$1ti1d$1 / ID-52924.news.uni-berlin.de>... > > "Van Jacques" <vanjac12 / yahoo.com> schrieb im Newsbeitrag > > news:70ae81fd.0312111642.26511e58 / posting.google.com... > > > > I really wouldn't call it "mod" since that makes users expect to calculate > > the equivalent of "a % b", which it doesn't. > > Yes, mod is not a good name. I was going to change it to gcd but never did. > > > > def mod(x,y) > > > z = x % y > > > if z == 0 > > > return y > > > else > > > w = mod(y,z) > > > end > > > end > > > > > > puts "Enter the number of numbers for greatest common denominator." > > > > > > num = gets.chomp.to_i > > > > > > a = Array.new > > > b = Array.new > > > gcd = Array.new > > > > > > for i in 0...num > > > a[i] = rand(999) + 1 > > > end > > > puts a > > > > You don't need to sort. > > Yes. I don't know what I was thinking of. Maybe you were thinking of some kind of shortcut if the smallest value is 1. > > > b = a.sort.reverse > > > puts b > > > gcd[0] = mod(b[0],b[1]) > > > > > > for i in 2...num > > > if (b[i] > gcd[i-2]) > > > gcd[i-1] = mod(b[i],gcd[i-2]) > > > else > > > gcd[i-1] = mod(gcd[i-2],b[i]) > > > end > > > end > > > puts gcd[num-2] > > > =========== > > > > Kind of a more complicated version of inject. But why do you store the > > results in an array? You just need one value: > > > > gcd = a.shift > > a.each{|n|gcd=mod(gcd, n)} > > puts gcd > > > > Kind regards > > > > robert > > Again, good point. I should "finish" my programs better. I developed some bad > and sloppy habits since I wrote a lot of Fortran programs for research that I was > the only one to read. I used a lot of arrays, and here I use them when they aren't > required. > > The last 3 lines of your code > > gcd = a.shift > > a.each{|n|gcd=mod(gcd, n)} > > puts gcd > > look like a good way to get the gcd of an arbitrary > number of numbers. (with mod(x,y) --> gcd1(x,y), say). That's exactly the same what inject does: gcd = a.inject {|a,b|mod(a,b)} :-) robert