ooxx7788 发表于 2017-4-19 18:51:18

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 *****

新手·ing 发表于 2017-4-19 19:57:34

不是伪!我让她变真!{:10_256:}

新手·ing 发表于 2017-4-19 19:59:21

@冬雪雪冬 @lumber2388779 @ooxx7788 @gopythoner @jerryxjr1220
来来来!算法,你们的最爱!

jerryxjr1220 发表于 2017-4-19 20:35:23

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

新手·ing 发表于 2017-4-19 20:37:40

jerryxjr1220 发表于 2017-4-19 20:35


{:10_277:}

奔跑的小鱼 发表于 2017-4-20 09:42:29

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

冬雪雪冬 发表于 2017-4-20 09:43:58

弄个笨办法的。
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

asgs_fishc 发表于 2017-4-20 11:31:02

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)

woshibilao4 发表于 2017-4-20 12:08:30

题 31(答题领鱼币) [修改]

jzyyqyq 发表于 2017-4-20 13:36:50

{:5_90:}

gopythoner 发表于 2017-4-20 14:46:12

当我第一次知道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

gopythoner 发表于 2017-4-20 14:57:18

冬雪雪冬 发表于 2017-4-20 09:43
弄个笨办法的。

我不同意你这个“笨”字
我觉得使用eval来解这种算术应该算是一种很划得来的方法,可以省去很多循环计算
我记得在知乎看过一个关于eval函数的传说,大意是一个麻神理工的大神在面试的时候,考官让他写一个函数,这个函数可以计算带有括号,除号等等数学运算符号的计算,然后大神问了一下是不是随便什么语言都行,考官说是的,然后大神就说eval(),写完了。。。。然后考场一片死寂


gopythoner 发表于 2017-4-20 15:03:15

新手·ing 发表于 2017-4-19 19:59
@冬雪雪冬 @lumber2388779 @ooxx7788 @gopythoner @jerryxjr1220
来来来!算法,你们的最爱!

你错了,我并不喜欢算法,毕竟我只搞爬虫,而且也只是简单实用excel分析信息,不需要去研究算法
不过有的算法的题目需要自己想构造函数,对这个比较感兴趣

sunnychou 发表于 2017-4-20 15:08:15

{:10_254:}

冬雪雪冬 发表于 2017-4-20 16:29:21

gopythoner 发表于 2017-4-20 14:57
我不同意你这个“笨”字
我觉得使用eval来解这种算术应该算是一种很划得来的方法,可以省去很多循环计算 ...

嗯,解释型语言很方便使用eval和exec。

gopythoner 发表于 2017-4-20 16:38:17

冬雪雪冬 发表于 2017-4-20 16:29
嗯,解释型语言很方便使用eval和exec。

使用eval直接计算N = 50000大概需要10秒左右
我试了一下其他用循环计算的,我一个帖子都发完了,还没出结果。。。
估计要几分钟

冬雪雪冬 发表于 2017-4-20 16:40:11

gopythoner 发表于 2017-4-20 16:38
使用eval直接计算N = 50000大概需要10秒左右
我试了一下其他用循环计算的,我一个帖子都发完了,还没 ...

eval是个取巧的方法,如果是各种语言通用的算法就还得用循环了。

ooxx7788 发表于 2017-4-20 17:09:26

本帖最后由 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.

plljxf 发表于 2017-4-20 18:33:37

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_

奔跑的小鱼 发表于 2017-4-20 19:35:09

ooxx7788 发表于 2017-4-20 17:09
你是说我这个题目里面N=50000要10秒吗?
我试了下我的,几乎就是一点就出来啊



你这个6了,我那个运行了5分钟还没弄出来{:5_99:}
页: [1] 2 3 4
查看完整版本: Python:每日一题 31(答题领鱼币)