gcd algorithm added
parent
0726d6c260
commit
ba0674c7e0
@ -0,0 +1,47 @@
|
||||
package gcd
|
||||
|
||||
func gcd(x uint, y uint) uint {
|
||||
|
||||
var shift uint = 0
|
||||
|
||||
if x == y {
|
||||
return x
|
||||
}
|
||||
|
||||
if x == 0 {
|
||||
return y
|
||||
}
|
||||
|
||||
if y == 0 {
|
||||
return x
|
||||
}
|
||||
|
||||
for shift := 0; (x | y) & 1 == 0; shift++ {
|
||||
x = x >> 1
|
||||
y = y >> 1
|
||||
}
|
||||
|
||||
for ; (x & 1) == 0 ; {
|
||||
x = x >> 1
|
||||
}
|
||||
|
||||
for ; y == 0 ; {
|
||||
|
||||
for ; (y & 1) == 0 ; {
|
||||
y = y >> 1
|
||||
}
|
||||
|
||||
if x > y {
|
||||
t := x
|
||||
x = y
|
||||
y = t
|
||||
}
|
||||
|
||||
y = y - x
|
||||
|
||||
}
|
||||
|
||||
y = y << shift
|
||||
|
||||
return y
|
||||
}
|
@ -0,0 +1,18 @@
|
||||
package gcd
|
||||
|
||||
import "testing"
|
||||
|
||||
func Test_gcd(t *testing.T) {
|
||||
|
||||
if gcd(100, 200) != 50 {
|
||||
t.Error("[Error] gcd(100, 200) is wrong")
|
||||
}
|
||||
|
||||
if gcd(4, 2) != 1 {
|
||||
t.Error("[Error] gcd(4,2) is wrong")
|
||||
}
|
||||
|
||||
if gcd(6, 3) != 3 {
|
||||
t.Error("[Error] gcd(6,3) is wrong")
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue