You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
78 lines
1.3 KiB
Go
78 lines
1.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"runtime"
|
|
)
|
|
|
|
var MAX uint64 = 1000000000
|
|
|
|
type Res struct{//this struct helps communicating with the channel eg. if channel will terminate, or what number it calculated
|
|
n uint64
|
|
nr uint64
|
|
nnr uint64
|
|
thread uint64
|
|
terminate bool
|
|
}
|
|
func reverseNum(num uint64) uint64{
|
|
var ret uint64 = 0
|
|
for num!=0{
|
|
ret = 10*ret + num%10
|
|
num /=10
|
|
}
|
|
return ret
|
|
}
|
|
func isAllOdd(num uint64) bool {
|
|
for num !=0 {
|
|
if num%2==0{
|
|
return false
|
|
}
|
|
num /=10
|
|
}
|
|
return true
|
|
}
|
|
func findRev(start uint64, end uint64, step uint64, ch chan Res){
|
|
for i:=start ; i < end; i+=step{
|
|
if i%10==0{
|
|
continue
|
|
}
|
|
h := i+reverseNum(i)
|
|
if isAllOdd(h){
|
|
r :=new(Res)
|
|
r.n =i
|
|
r.nr = reverseNum(i)
|
|
r.nnr = h
|
|
r.thread = start // is equal to thread
|
|
r.terminate = false
|
|
ch <- *r
|
|
}
|
|
}
|
|
r:= new(Res)
|
|
r.terminate = true
|
|
ch<-*r
|
|
}
|
|
func main() {
|
|
numThreads := runtime.NumCPU()
|
|
ch := make(chan Res)
|
|
for i:=0 ;i< numThreads; i++{
|
|
go findRev(uint64(i),MAX, uint64(numThreads),ch)
|
|
}
|
|
var n uint64 = 0
|
|
for {
|
|
h:=<-ch
|
|
if h.terminate{
|
|
numThreads--
|
|
if numThreads <=0{
|
|
fmt.Printf("\nTotal reversibles found:%d\n", n)
|
|
break
|
|
}
|
|
continue
|
|
}
|
|
n++
|
|
//fmt.Printf("zahl=%d rev(zahl)=%d zahl+rev(zahl)=%d n=%d thread=%d\n", h.n,h.nr,h.nnr,n,h.thread)
|
|
|
|
|
|
}
|
|
|
|
}
|