summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2011-07-23 15:51:49 +0400
committerIgor Pashev <pashev.igor@gmail.com>2011-07-23 15:51:49 +0400
commit82a49b27ea3839ecccf503d8df428d982d9c3a57 (patch)
treedd5e9cd9343d8878356e4e1519835f111e971ae0
parent6d2dc53200f7d693654c22f3d69ca44bb13bd573 (diff)
downloadgcd-82a49b27ea3839ecccf503d8df428d982d9c3a57.tar.gz
Added Go, tested with 6g and GCC 4.6.1
-rw-r--r--gcd.go61
1 files changed, 61 insertions, 0 deletions
diff --git a/gcd.go b/gcd.go
new file mode 100644
index 0000000..6717274
--- /dev/null
+++ b/gcd.go
@@ -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)
+ }
+}
+