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
5 years ago
|
package main
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"runtime"
|
||
|
)
|
||
|
|
||
|
var MAX uint64 = 1000000000
|
||
|
|
||
|
type Res struct{//this struct help communicating with the channel eg. weather 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)
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|