2021-05-27:定义何为step sum?比如680,680+68+6=754,680的step sum叫754。给定一个整数num,判断它是不是某个数的step sum?

福大大 答案2021-05-27:

方法一:
自然智慧即可。二分法。在0到num之间找中点,然后求中点的step sum。如果step sum太大,取左边;如果step sum太小,取右边。时间复杂度是(log2N)*(log10N)。
方法二:
1.求出不大于num的最大的全1数,然后num/全1数。如果商大于等于10,直接返回false。
2.看余数。
2.1.当余数不为0时,num=余数,全1数=(全1数/10),重复步骤1。
2.2.当余数为0时,返回true。
时间复杂度是log10N。

代码用golang编写。代码如下:

package main

import "fmt"

//05
func main() {
    count := 0
    for i := 1; i <= 11111; i++ {
        ret1 := isStepSum1(i)
        ret2 := isStepSum2(i)
        fmt.Println(i, ret1, ret2)
        count++
    }
    fmt.Println("正确数 = ", count)
}

//方法1
func isStepSum1(stepSum int) bool {
    L := 0
    R := stepSum
    M := 0
    cur := 0
    for L <= R {
        M = L + (R-L)>>1
        cur = getStepSum(M)
        if cur == stepSum {
            return true
        } else if cur < stepSum {
            L = M + 1
        } else {
            R = M - 1
        }
    }
    return false
}

func getStepSum(num int) int {
    sum := 0
    for num != 0 {
        sum += num
        num /= 10
    }
    return sum
}

//方法2
func isStepSum2(stepSum int) bool {
    global111 := getGlobal111(stepSum)
    for global111 > 0 {
        quotient := stepSum / global111  //商
        remainder := stepSum % global111 //余数
        if quotient >= 10 {
            return false
        }
        global111 /= 10
        stepSum = remainder
    }
    return true
}

func getGlobal111(num int) int {
    ans := 1
    anstemp := 11
    for anstemp <= num {
        ans = anstemp
        anstemp *= 10
        anstemp++
    }
    return ans
}

执行结果如下:
图片


左神java代码