鱼C论坛

 找回密码
 立即注册
查看: 9605|回复: 71

[技术交流] Python:每日一题 31(答题领鱼币)

[复制链接]
发表于 2017-4-19 18:51:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 新手·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


下面是我的渣代码,也不知道自己求的对不对啊!
游客,如果您要查看本帖隐藏内容请回复

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-19 19:57:34 | 显示全部楼层
不是伪!我让她变真!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-19 19:59:21 | 显示全部楼层
@冬雪雪冬 @lumber2388779 @ooxx7788 @gopythoner @jerryxjr1220
来来来!算法,你们的最爱!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-19 20:35:23 | 显示全部楼层
  1. def sum_num(n):
  2.         result = 0
  3.         c = 1
  4.         num_list = list(range(1,n+1))
  5.         while num_list:
  6.                 tmp = 1
  7.                 for i in range(c):
  8.                         if len(num_list)>0:
  9.                                 tmp *= num_list.pop(0)
  10.                 result += tmp
  11.                 c += 1
  12.         else:
  13.                 return result
复制代码

评分

参与人数 3荣誉 +5 鱼币 +4 收起 理由
moc + 1 + 1 谢谢分享!
ooxx7788 + 1 我就服jerry大神!
新手·ing + 3 + 3 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-4-19 20:37:40 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-4-20 09:43:58 | 显示全部楼层
弄个笨办法的。
  1. def func(n):
  2.     list1 = [str(i) for i in range(1, n + 1)]
  3.     list2 = []
  4.     x = 1
  5.     count = 0
  6.     while count < n:
  7.         list2.append('+')
  8.         list2.extend(['*'] * x)
  9.         count += 1 + x
  10.         x += 1
  11.     sum1 = ''
  12.     for i in range(n - 1):
  13.         sum1 += list1[i] + list2[i]
  14.     sum1 += list1[-1]
  15.     return eval(sum1)
复制代码
  1. >>> func(20)
  2. 2226007
  3. >>> func(10)
  4. 5167
复制代码

点评

我很赞同!: 5.0
我很赞同!: 5
  发表于 2017-4-20 16:56
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-20 12:08:30 | 显示全部楼层
题 31(答题领鱼币) [修改]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-20 13:36:50 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-20 14:46:12 | 显示全部楼层
当我第一次知道eval函数的时候,我就知道它是个神奇的东西
  1. def getstr(n):
  2.   dic = {}
  3.   for m in range(1,n):
  4.     dic[m] = "*"
  5.   for i in range(1,n//2+1):
  6.     k = sum(list(range(1,i+1)))
  7.     if k < n:
  8.       dic[k] = "+"
  9.   thestr = ""
  10.   for each in dic:
  11.     thestr += (str(each)+dic[each])
  12.   thestr += str(n)
  13.   the_num = eval(thestr)
  14.   print(thestr+"="+str(the_num))

  15. getstr(20)
复制代码

>>>1+2*3+4*5*6+7*8*9*10+11*12*13*14*15+16*17*18*19*20=2226007

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
新手·ing + 3 + 3 支持楼主!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-20 14:57:18 | 显示全部楼层

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


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-20 15:03:15 | 显示全部楼层
新手·ing 发表于 2017-4-19 19:59
@冬雪雪冬 @lumber2388779 @ooxx7788 @gopythoner @jerryxjr1220
来来来!算法,你们的最爱!

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

点评

我很赞同!: 5.0
我很赞同!: 5
爬虫也要向你学习!  发表于 2017-4-20 16:57
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-20 15:08:15 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

嗯,解释型语言很方便使用eval和exec。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-20 16:38:17 | 显示全部楼层
冬雪雪冬 发表于 2017-4-20 16:29
嗯,解释型语言很方便使用eval和exec。


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

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
奔跑的小鱼 + 3 + 3 服气,效率高好多,get到了

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

eval是个取巧的方法,如果是各种语言通用的算法就还得用循环了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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秒吗?
我试了下我的,几乎就是一点就出来啊


  1. print(foo(200000))      # 我的
  2. print(func(200000))     # 冬雪的
  3. print(sum_num(200000))  # jerry的
复制代码

看来还是工具快啊。

输出:
  1. Total used 0.134005s, loops: 1.
  2. Total used 1.011058s, loops: 1.
  3. Total used 9.257532s, loops: 1.
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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):
            if  i<=n:
                mul *=i
                i +=1
            else:
                break
        sum_ +=mul
        cnt +=1
        mul=1
    return sum_
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你这个6了,我那个运行了5分钟还没弄出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-3-28 21:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表