题目链接: 338. 计数问题
主体思路
暴力行不通
记住关键词:分情况讨论
注意细节
【go语言细节】
- os包就是提供os.Stdin
- 读取大数,该使用bufio包实现快速输入(bufio.NewReader
fmt.Fscanln
)其效果如下:
使用fmt.Scanf
使用bufio.NewReader
+ fmt.Fscanln
- 最后别忘记这句话: fmt.Println()
,不然所有答案都输出在一行了
基础代码
package main
import (
"bufio"
"fmt"
"os"
)
func get(num []int, l, r int) (res int) {
for i := l; i >= r; i-- { res = res * 10 + num[i] }
return
}
func power10(x int) (res int) {
res = 1
for ; x > 0; x-- { res *= 10 }
return
}
func cal(n, x int) (res int) {
if n == 0 { return 0 }
num := []int{}
for n != 0 {
num = append(num, n % 10)
n /= 10
}
n = len(num)
isZero := 0
if x == 0 { isZero = 1 }
for i := n - 1 - isZero; i >= 0; i-- {
if i < n - 1 {
res += get(num, n - 1, i + 1) * power10(i)
if x == 0 { res -= power10(i) }
}
if num[i] == x {
res += get(num, i - 1, 0) + 1
} else if num[i] > x {
res += power10(i)
}
}
return
}
func main() {
var (
in = bufio.NewReader(os.Stdin)
a, b int
)
for {
fmt.Fscanln(in, &a, &b)
if a == 0 && b == 0 { break }
if a > b { a, b = b, a}
for i := 0; i < 10; i++ { fmt.Printf("%d ", cal(b, i) - cal(a - 1, i)) }
fmt.Println()
}
}