Python: 每日一题 53
本帖最后由 ooxx7788 于 2017-5-25 15:41 编辑我觉得这题我说的太清楚,就实在太简单了,所以尽量少说话。
89 --> 8**1 + 9**2 = 89 * 1
695 --> 6**2 + 9**3 + 5**4= 1390 = 695 * 2
46288 --> 4**3 + 6**4+ 2**5 + 8**6+ 8**7= 2360688 = 46288 * 51
dig_pow(89, 1)return 1
dig_pow(46288, 3) return 51
如果不能返回整数,则返回-1。
test.assert_equals(dig_pow(89, 1), 1)
test.assert_equals(dig_pow(92, 1), -1)
test.assert_equals(dig_pow(46288, 3), 51) 本帖最后由 冬雪雪冬 于 2017-5-25 16:23 编辑
可以是0次方吗?
----理解错题目了,还以为方次是任意的 本帖最后由 ButcherRabbit 于 2017-5-25 22:16 编辑
def dig_pow(spam,num1):
sum1 = 0
spam1 = str(spam)
for each in range(0,len(spam1)):
sum1 += int(spam1)**num1
num1 += 1
if sum1 %spam == 0:
return sum1//spam
else:
return -1
print('dig_pow(89, 1)',dig_pow(89, 1))
print('dig_pow(92, 1)',dig_pow(92, 1))
print('dig_pow(46288, 3)',dig_pow(46288, 3))
def dig_pow(spam,num1):
sum1 = 0
spam1 = spam
num1 = num1+len(str(spam1))-1
for each in range(0,len(str(spam1))):
sum1 += (spam1%10)**num1
num1 -= 1
spam1 = spam1//10
if sum1 %spam == 0:
return sum1//spam
else:
return -1
print('dig_pow(89, 1)',dig_pow(89, 1))
print('dig_pow(92, 1)',dig_pow(92, 1))
print('dig_pow(46288, 3)',dig_pow(46288, 3))
def dig_pow(m,n):
sum=0
for each in str(m):
sum+=(int(each))**n
n+=1
return int(sum/m)if sum%m==0 else -1
def test():
print (dig_pow(89, 1))
print (dig_pow(92, 1))
print (dig_pow(46288, 3))
本帖最后由 sunnychou 于 2017-5-26 09:42 编辑
{:10_266:}{:10_266:}思路差不多
def dig_pow(m,i):
sum = 0
for each in str(m):
sum += int(each) ** i
i += 1
if sum % m == 0:
return sum // m
else:
print(-1)
print('dig_pow(89,1)',dig_pow(89,1)) 我觉得这题如果不告诉你后一个数字,计算起来就比较有难度了。
比如给89,返回1,1
给46288,返回3,51 jerryxjr1220 发表于 2017-5-26 08:58
我觉得这题如果不告诉你后一个数字,计算起来就比较有难度了。
比如给89,返回1,1
给46288,返回3,51
那这个题目就有点太难了。
要能拆分原始数字,又能想出是各位数的指数和,最后还要倒除本数。这个大概就是解密的玩法了。
选题目也困难,感觉5,6kyu之间的差距有点大。像这个题目6kyu基本逻辑上面就是直的。 ooxx7788 发表于 2017-5-26 09:31
那这个题目就有点太难了。
要能拆分原始数字,又能想出是各位数的指数和,最后还要倒除本数。这个大概就 ...
穷举法的程序其实不难,难的是如果幂次i非常大的话,运算会很慢,而且也有可能根本就求不出,所以我假设当i>10000就返回-1.
def dpow(n):
i = 1
while True:
t = sum()**(i + j) for j in range(len(str(n)))])
if t % n == 0:
return i, t // n
else:
i += 1
if i > 10000:
return -1
print(dpow(46288))
怎么题目越出越简单呢~
>>> dig_pow = lambda x,y:sum((int(n)**i for i,n in enumerate(str(x),y)))//x
>>> dig_pow(89, 1)
1
>>> dig_pow(46288, 3)
51
>>> dig_pow(92, 1)
0
>>> SixPy 发表于 2017-5-26 10:05
怎么题目越出越简单呢~
虽然说越出越简单,不过你做的不对哦!
dig_pow(92, 1) 返回值是-1 ooxx7788 发表于 2017-5-26 10:44
虽然说越出越简单,不过你做的不对哦!
dig_pow(92, 1) 返回值是-1
你定义就不对
商不是整数就应该 得0 SixPy 发表于 2017-5-26 11:12
你定义就不对
商不是整数就应该 得0
这里-1表示的应该是缺损值吧。。。
不过反正就是那么个意思。 ooxx7788 发表于 2017-5-26 11:43
这里-1表示的应该是缺损值吧。。。
不过反正就是那么个意思。
那还不如返回None 就是各个位算依次指数后求和,然后除以自己得到几输出几
def dig_pow(n,k):
result = sum([(int(i))**j for i,j in zip(str(n),range(k,k+len(str(n))))])/n
return int(result) if result%1==0 else -1 def dig_pow(m,n):
n = n +len(str(m))-1
a = m
result = 0
while m:
result += (m % 10)**n
m //= 10
n -= 1
return int(result//a) if result % a == 0 else -1 本帖最后由 shigure_takimi 于 2017-12-4 14:02 编辑
def dig_pow(a,b):
numberToString = str(a)
length = len(numberToString)
x = sum([(int(numberToString))**(i+b) for i in range(length)])
return x//a if (x/a)%1 == 0 else -1
print(dig_pow(89,1))# 1
print(dig_pow(92,1)) # -1
print(dig_pow(46288,3))# 51
print(dig_pow(695,2))# 2
def dig_pow(a,b):
return sum([(int(str(a)))**(i+b) for i in range(len(str(a)))])//a if (sum([(int(str(a)))**(i+b) for i in range(len(str(a)))])/a)%1 == 0 else -1
print(dig_pow(89,1))# 1
print(dig_pow(92,1)) # -1
print(dig_pow(46288,3))# 51
print(dig_pow(695,2))# 2
## 把numberToString 、length、x都代入到return,也可以写成一句话,结果是一样的,但看起来就没有那么易懂了。
## 1
## -1
## 51
## 2
import test
def dig_pow(a,b):
num_a = str(a)
length = len(num_a)
result = 0
i = b
for each in range(length):
result += int(num_a)**i
i += 1
return result / a if result %a == 0 else -1
test.assert_equals(dig_pow(89, 1), 1)
test.assert_equals(dig_pow(92, 1), -1)
test.assert_equals(dig_pow(46288, 3), 51)
def f_53(num, n):
num_str = str(num)
total = sum()**(n+i) for i in range(len(num_str))])
return int(total / num) if total % num == 0 else -1 def pow(n,m):
#n 为输入值, m为平方根次数,对n的各个数字依次按m取平方根
#将n转为str
str_n = str(n)
sum = 0
for each in (str_n):
sum += int(each)**m
m += 1
if sum % n == 0:
return sum // n
else:
return -1
print(pow(46288, 3))
页:
[1]