"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