【每日一题0909】神奇数字游戏

:woman_mage:哈利波特最近惊奇地发现有一些数字存在着有趣的规律:比如89,将81 + 92 得到的结果刚好等于 89*1。再比如695,如果将62 + 93 + 54 = 1390,刚好等于 695*2
我们的任务是编写一个python函数,帮助哈利波特找出这些神奇数字吧。假设输入一个数字xyz和一个正整数幂p,如果满足xp + yp+1 + zp+2 = n * k,当k是正整数则返回k,否则返回-1。

示例:
输入:(89, 1),返回1。因为81+92=89*1。

题目难度:中等
题目来源:codewars

def dig_pow(xyz: int, p: int) -> int:
    pass

assert dig_pow(89, 1) == 1
assert dig_pow(92, 1) == -1
assert dig_pow(46288, 3) == 51
def dig_pow(xyz: int, p: int):
    a=0
    boolean=True
    for i in str(xyz):
        a=int(i)**p+a
        p=p+1
    while boolean:
        if a%xyz==0:
            k=int(a/xyz)
            return k
        else:
            return -1

常规解法:

def dig_pow(xyz: int, p: int) -> int:
    
    total = 0
    for i,item in enumerate(list(str(xyz)), p):
        total += int(item) ** i
        
    return int(total / xyz) if total % xyz == 0 else -1

assert dig_pow(89, 1) == 1
assert dig_pow(92, 1) == -1
assert dig_pow(46288, 3) == 51

解题思路:

  1. 先将数字xyz逐个拆分,并组成一个新列表data
  2. 利用enumerate函数,索引从p开始递增
  3. 对data元素进行求和
  4. 判断是否能整除,如果可以则返回对应乘数n;否则返回-1。

参考题解:

def dig_pow(xyz: int, p: int) -> int:
    total = sum( int(d) ** (p+i) for i, d in enumerate(str(xyz)) )
    return total // xyz if total % xyz == 0 else -1

assert dig_pow(89, 1) == 1
assert dig_pow(92, 1) == -1
assert dig_pow(46288, 3) == 51

解题思路:遍历原数字拆分后的序列进行汇总求和,然后求乘数返回对应结果。这种写法更简洁精炼(P.S.阅读需要些代码功力)。

1 个赞
public Integer digPow(Integer xyz, Integer p) {
        int res = 0;
        // 将数字拆分成个位数
        List<Integer> digits = digits(xyz);
        for (int i = digits.size() - 1; i >= 0; i--) {
            // 幂运算
            res += power(digits.get(i), p);
            p++;
        }
        int result = res % xyz == 0 ? (res / xyz) : -1;
        return result  ;
    }