diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2011-07-23 15:51:49 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2011-07-23 15:51:49 +0400 |
commit | 82a49b27ea3839ecccf503d8df428d982d9c3a57 (patch) | |
tree | dd5e9cd9343d8878356e4e1519835f111e971ae0 | |
parent | 6d2dc53200f7d693654c22f3d69ca44bb13bd573 (diff) | |
download | gcd-82a49b27ea3839ecccf503d8df428d982d9c3a57.tar.gz |
Added Go, tested with 6g and GCC 4.6.1
-rw-r--r-- | gcd.go | 61 |
1 files changed, 61 insertions, 0 deletions
@@ -0,0 +1,61 @@ +/* + SYNOPSIS: + + With GCC >= 4.6: + # gccgo gcd.go -o gcd-go + # ./gcd-go 11 22 33 44 121 + + With Google Go (maybe 6g, 8g): + # 6g -o gcd-go.o gcd.go + # 6l -o gcd-go-6g gcd-go.o + # ./gcd-go-6g 11 22 33 44 121 + + GCC makes dynamically linked binary, + but Google Go - statically linked + +*/ + +package main + +// Both Google Go and GCC issues an error "imported and not used", +// if imported and not used :-) +import "fmt" +import "flag" +import "strconv" + +func gcd2 (a, b uint) uint { + if b == 0 { + return a + } + /* 6g issues an error "function ends without a return statement", + if we use if ... {... return} else {... return}. + But GCC doesn't. + */ + return gcd2(b, a % b) +} + +func gcdn (ns []uint) uint { + var r uint // zero by default + for i := range ns { + r = gcd2(r, ns[i]) + } + return r +} + +func main() { + flag.Parse() // without this 6g will give flag.NArg() = 0 next (WTF?) + n := flag.NArg() + if n > 0 { + ns := make([]uint, n) // We have garbage collector! + + // Or: for i := range ns, since range of ns is equal to flag.NArg() + for i := 0; i < n; i++ { + // Drop the second return value (error code): + ns[i], _ = strconv.Atoui(flag.Arg(i)) + } + + g := gcdn(ns) + fmt.Printf("%v\n", g) + } +} + |