题目大家都有这里就不再复制了
我的解题思路:
1.一个标识数组flag[100],初始化数组值都为0,用来标识被覆盖的数。
2.输入的值,经过卡拉兹(Callatz)猜想的计算,然后把对应的标识位置为1
3.由于100以内的数组也可能计算出>100的中间值,这里把计算出来>100的值过滤,避免数组越界
4.结合标识数组,进行循环,如果标识位为1的把值去除,剩下的就关键数
package main
import (
"fmt"
"sort"
)
func main() {
var n, a int
var flag [101]int
fmt.Scanf("%d", &n)
number := make([]int, n)
for i:=0; i<n; i++ {
fmt.Scanf("%d", &a)
number[i] = a
if flag[a] == 1 {
continue
}
for a != 1 {
if a % 2 == 0 {
a = a / 2
} else {
a = (3 * a + 1) / 2
}
if a < 100 {
flag[a] = 1
}
}
}
count := n
for i:=0; i<n; i++ {
if flag[number[i]] == 1 {
number[i] = 0
count--
}
}
sort.Ints(number)
for i:=n-1; i>=0; i-- {
if number[i] == 0 || i + count == n {
fmt.Printf("%d\n", number[i])
break
}
fmt.Printf("%d ", number[i])
}
}