-
Notifications
You must be signed in to change notification settings - Fork 0
/
p120.go
66 lines (60 loc) · 1.2 KB
/
p120.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package main
import (
"fmt"
"math/big"
)
func main() {
fmt.Println(p120(3, 1000))
//fmt.Println(ReminderMax(700))
}
func p120(start, end int) int {
var rMaxSum int
for i:=start; i<=end; i++ {
rMaxSum += ReminderMax(i)
}
return rMaxSum
}
func ReminderMax(in int) int {
var a = big.NewInt(int64(in))
var array []int64
var power, aLeft, aRight, n big.Int
var pointer, maxIndex int
power.Exp(a, big.NewInt(2), nil)
aLeft.Sub(a, big.NewInt(1))
aRight.Add(a, big.NewInt(1))
//rMax := 0
n.SetInt64(1)
for {
ps := PowerSum(&aLeft, &aRight, &n)
array = append(array, ps.Mod(ps, &power).Int64())
if maxIndex !=0 && array[pointer] == array[maxIndex] {
pointer++
} else {
pointer = 0
}
// 如果队列中有3个重复的数,则认为已经进入了循环
if pointer >= 3{
break
}
n.Add(&n, big.NewInt(1))
maxIndex++
}
return int(ArrayMax(array))
}
//go居然没有好用的整数求幂运算符
func PowerSum(x, y, p *big.Int) *big.Int {
var rx, ry big.Int
rx.Exp(x, p, nil)
ry.Exp(y, p, nil)
return rx.Add(&rx, &ry)
}
//找到数组中最大的数
func ArrayMax(array []int64) int64 {
var max int64 = 0
for _, i := range array {
if max < i {
max = i
}
}
return max
}