密码战。一些测试通过了,但我需要得到输出以下错误的测试:3263 应该等于 -1
Codewars. Some tests are passed, but i need to get tests which outputs the following mistake: 3263 should equal -1
你能解释一下这里有什么问题吗?在我看来,这段代码就像一堆废话,但解决方案是正确的。请原谅我的英语。
这个型的任务:
一些数字具有有趣的特性。例如:
89 --> 8¹ + 9² = 89 * 1
695 --> 6² + 9³ + 5⁴= 1390 = 695 * 2
46288 --> 4³ + 6⁴+ 2⁵ + 8⁶ + 8⁷ = 2360688 = 46288 * 51
给定一个正整数n写成abcd...(a,b,c,d...都是数字)和一个正整数p我们要找一个正整数k,如果存在,比如n 的数字与 p 的连续幂的总和等于 k n。换句话说:
Is there an integer k such as : (a ^ p + b ^ (p+1) + c ^(p+2) + d ^ (p+3) + ...) = n * k
如果是这样我们就returnk,如果不是return-1.
注意:n、p 将始终严格为正整数。
dig_pow(89, 1)
应该 return 1 因为 8¹ + 9² = 89 = 89 * 1
dig_pow(92, 1)
应该 return -1 因为没有 k 例如 9¹ + 2² 等于 92 * k
dig_pow(695, 2)
应该 return 2 因为 6² + 9³ + 5⁴= 1390 = 695 * 2
dig_pow(46288, 3)
应该 return 51 因为 4³ + 6⁴+ 2⁵ + 8⁶ + 8⁷ = 2360688 = 46288 * 51
def dig_pow(n, p):
if n > 0 and p > 0:
b = []
a = str(n)
result = []
for i in a:
b.append(int(i))
for x in b:
if p != 1:
result.append(x ** p)
p += 1
else:
result.append(x ** (p + 1))
if int((sum(result)) / n) < 1:
return -1
elif int((sum(result)) / n) < 2:
return 1
else:
return int((sum(result)) / n)
测试结果:
测试通过
测试通过
测试通过
测试通过
3263 应该等于 -1
我不知道您使用的 Python 的确切版本。以下代码在 Python 3 中。如果我猜对了,代码可以像
一样简单
def dig_pow(n, p):
assert n > 0 and p > 0
digits = (int(i) for i in str(n)) # replaces your a,b part with generator
result = 0 # you don't use result as a list, so an int suffice
for x in digits: # why do you need if in the loop? (am I missing something?)
result += x ** p
p += 1
if result % n: # you just test for divisibility
return -1
else:
return result // n
主要问题是,在你的objective中,你只有返回两个选项,但你写了if elif else
,这绝对是不必要的,会导致问题和错误。 %
是模运算符。
另外,有一个 if
而在另一个分支中不返回任何东西通常不是一个好主意(参见 assert
部分)。当然,如果你不喜欢,就退回到if
。
我相信这也可以,我发现它更容易阅读,但它肯定可以改进:
def dig_pow(n, p):
value = 0
for digit in str(n):
value += int(digit)**p
p += 1
for k in range(1,value):
if value/k == n:
return k
return -1
你能解释一下这里有什么问题吗?在我看来,这段代码就像一堆废话,但解决方案是正确的。请原谅我的英语。 这个型的任务:
一些数字具有有趣的特性。例如:
89 --> 8¹ + 9² = 89 * 1
695 --> 6² + 9³ + 5⁴= 1390 = 695 * 2
46288 --> 4³ + 6⁴+ 2⁵ + 8⁶ + 8⁷ = 2360688 = 46288 * 51
给定一个正整数n写成abcd...(a,b,c,d...都是数字)和一个正整数p我们要找一个正整数k,如果存在,比如n 的数字与 p 的连续幂的总和等于 k n。换句话说:
Is there an integer k such as : (a ^ p + b ^ (p+1) + c ^(p+2) + d ^ (p+3) + ...) = n * k
如果是这样我们就returnk,如果不是return-1.
注意:n、p 将始终严格为正整数。
dig_pow(89, 1)
应该 return 1 因为 8¹ + 9² = 89 = 89 * 1
dig_pow(92, 1)
应该 return -1 因为没有 k 例如 9¹ + 2² 等于 92 * k
dig_pow(695, 2)
应该 return 2 因为 6² + 9³ + 5⁴= 1390 = 695 * 2
dig_pow(46288, 3)
应该 return 51 因为 4³ + 6⁴+ 2⁵ + 8⁶ + 8⁷ = 2360688 = 46288 * 51
def dig_pow(n, p):
if n > 0 and p > 0:
b = []
a = str(n)
result = []
for i in a:
b.append(int(i))
for x in b:
if p != 1:
result.append(x ** p)
p += 1
else:
result.append(x ** (p + 1))
if int((sum(result)) / n) < 1:
return -1
elif int((sum(result)) / n) < 2:
return 1
else:
return int((sum(result)) / n)
测试结果:
测试通过
测试通过
测试通过
测试通过
3263 应该等于 -1
我不知道您使用的 Python 的确切版本。以下代码在 Python 3 中。如果我猜对了,代码可以像
一样简单def dig_pow(n, p):
assert n > 0 and p > 0
digits = (int(i) for i in str(n)) # replaces your a,b part with generator
result = 0 # you don't use result as a list, so an int suffice
for x in digits: # why do you need if in the loop? (am I missing something?)
result += x ** p
p += 1
if result % n: # you just test for divisibility
return -1
else:
return result // n
主要问题是,在你的objective中,你只有返回两个选项,但你写了if elif else
,这绝对是不必要的,会导致问题和错误。 %
是模运算符。
另外,有一个 if
而在另一个分支中不返回任何东西通常不是一个好主意(参见 assert
部分)。当然,如果你不喜欢,就退回到if
。
我相信这也可以,我发现它更容易阅读,但它肯定可以改进:
def dig_pow(n, p):
value = 0
for digit in str(n):
value += int(digit)**p
p += 1
for k in range(1,value):
if value/k == n:
return k
return -1