Python:每日一题 31(答题领鱼币)
本帖最后由 新手·ing 于 2017-4-19 19:58 编辑今日群里面一个朋友问的一个题目,不过他本身题目有点缺陷,我给修改了一下,给大家娱乐娱乐。
求:1+2*3+4*5*6+7*8*9*10+11*12*13*14*15+……+(n-k)*...*(n-1)*n的和。
说明:第k个加法项,就有n个数相乘,如果最后一项不足,有几项相乘几项。
例如:n=13时,则求1+2*3+4*5*6+7*8*9*10+11*12*13
n=16时,则求1+2*3+4*5*6+7*8*9*10+11*12*13*14*15+16
下面是我的渣代码,也不知道自己求的对不对啊!
**** Hidden Message ***** 不是伪!我让她变真!{:10_256:} @冬雪雪冬 @lumber2388779 @ooxx7788 @gopythoner @jerryxjr1220
来来来!算法,你们的最爱! def sum_num(n):
result = 0
c = 1
num_list = list(range(1,n+1))
while num_list:
tmp = 1
for i in range(c):
if len(num_list)>0:
tmp *= num_list.pop(0)
result += tmp
c += 1
else:
return result jerryxjr1220 发表于 2017-4-19 20:35
{:10_277:} def my_math(n):
z = (i for i in range(1,n+1))
my_sum = 0
for i in range(1,n+1):
qiuji = 1
for y in range(0,i):
try:
qiuji*=z.__next__()
except:pass
if qiuji !=1:
my_sum += qiuji
return my_sum+1
弄个笨办法的。
def func(n):
list1 =
list2 = []
x = 1
count = 0
while count < n:
list2.append('+')
list2.extend(['*'] * x)
count += 1 + x
x += 1
sum1 = ''
for i in range(n - 1):
sum1 += list1 + list2
sum1 += list1[-1]
return eval(sum1)
>>> func(20)
2226007
>>> func(10)
5167 number = input('请输入n: ')
num = int(number)
# 默认输入的数大于等于1
i = 1
string = ''
flag = False
for i in range(1, num + 1):
if i == 1:
string = string + '1'
if i == num:
flag = True
break
else:
for j in range(int((i*(i -1) + 2)/2),int(((i*(i -1) + 2)/2) + i)):
if j == (i*(i -1) + 2)/2:
string = string + '+' + str(j)
else :
string = string + '*' + str(j)
if j == num:
flag = True
break
if flag:
break
print(string)
题 31(答题领鱼币) [修改] {:5_90:} 当我第一次知道eval函数的时候,我就知道它是个神奇的东西
def getstr(n):
dic = {}
for m in range(1,n):
dic = "*"
for i in range(1,n//2+1):
k = sum(list(range(1,i+1)))
if k < n:
dic = "+"
thestr = ""
for each in dic:
thestr += (str(each)+dic)
thestr += str(n)
the_num = eval(thestr)
print(thestr+"="+str(the_num))
getstr(20)
>>>1+2*3+4*5*6+7*8*9*10+11*12*13*14*15+16*17*18*19*20=2226007 冬雪雪冬 发表于 2017-4-20 09:43
弄个笨办法的。
我不同意你这个“笨”字
我觉得使用eval来解这种算术应该算是一种很划得来的方法,可以省去很多循环计算
我记得在知乎看过一个关于eval函数的传说,大意是一个麻神理工的大神在面试的时候,考官让他写一个函数,这个函数可以计算带有括号,除号等等数学运算符号的计算,然后大神问了一下是不是随便什么语言都行,考官说是的,然后大神就说eval(),写完了。。。。然后考场一片死寂
新手·ing 发表于 2017-4-19 19:59
@冬雪雪冬 @lumber2388779 @ooxx7788 @gopythoner @jerryxjr1220
来来来!算法,你们的最爱!
你错了,我并不喜欢算法,毕竟我只搞爬虫,而且也只是简单实用excel分析信息,不需要去研究算法
不过有的算法的题目需要自己想构造函数,对这个比较感兴趣 {:10_254:} gopythoner 发表于 2017-4-20 14:57
我不同意你这个“笨”字
我觉得使用eval来解这种算术应该算是一种很划得来的方法,可以省去很多循环计算 ...
嗯,解释型语言很方便使用eval和exec。 冬雪雪冬 发表于 2017-4-20 16:29
嗯,解释型语言很方便使用eval和exec。
使用eval直接计算N = 50000大概需要10秒左右
我试了一下其他用循环计算的,我一个帖子都发完了,还没出结果。。。
估计要几分钟 gopythoner 发表于 2017-4-20 16:38
使用eval直接计算N = 50000大概需要10秒左右
我试了一下其他用循环计算的,我一个帖子都发完了,还没 ...
eval是个取巧的方法,如果是各种语言通用的算法就还得用循环了。 本帖最后由 ooxx7788 于 2017-4-20 17:14 编辑
gopythoner 发表于 2017-4-20 16:38
使用eval直接计算N = 50000大概需要10秒左右
我试了一下其他用循环计算的,我一个帖子都发完了,还没 ...
你是说我这个题目里面N=50000要10秒吗?
我试了下我的,几乎就是一点就出来啊
print(foo(200000)) # 我的
print(func(200000)) # 冬雪的
print(sum_num(200000))# jerry的
看来还是工具快啊。
输出:
Total used 0.134005s, loops: 1.
Total used 1.011058s, loops: 1.
Total used 9.257532s, loops: 1.
def mysum(n=5):
sum_=0
cnt=1
mul=1
i=1
while i<=n:
for j in range(cnt):
ifi<=n:
mul *=i
i +=1
else:
break
sum_ +=mul
cnt +=1
mul=1
return sum_ ooxx7788 发表于 2017-4-20 17:09
你是说我这个题目里面N=50000要10秒吗?
我试了下我的,几乎就是一点就出来啊
你这个6了,我那个运行了5分钟还没弄出来{:5_99:}