哈利波特最近惊奇地发现有一些数字存在着有趣的规律:比如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
解题思路:
- 先将数字xyz逐个拆分,并组成一个新列表data
- 利用enumerate函数,索引从p开始递增
- 对data元素进行求和
- 判断是否能整除,如果可以则返回对应乘数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 ;
}