鱼C论坛

 找回密码
 立即注册
查看: 6237|回复: 34

[技术交流] Python: 每日一题 120

[复制链接]
发表于 2017-11-2 07:08:11 From FishC Mobile | 显示全部楼层 |阅读模式

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

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

x
首先我们的玩法做了一下改变:
1. 楼主不再提供答案。
2. 请大家先独立思考,再参考各位大神的答案,这样才有助于提高自己的编程水平。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。

题目: 雷劈数
3025是个很有意思的数字,把3025从中间一分为二可以得到30和25,而把30和25相加得到55,其平方正好等于3025。我们把3025这样的数称为雷劈数。
试着找出所有1000000以下的雷劈数,它们的和是多少?

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-11-2 08:57:28 | 显示全部楼层
本帖最后由 SixPy 于 2017-11-2 09:08 编辑
  1. def split_num(lmt:int):
  2.     from math import log10, ceil
  3.     ls = []
  4.     for e in range(2,ceil(log10(lmt))+1,2):
  5.         for n in range(10**(e-1),10**(e)):
  6.             if sum(divmod(n,10**(e//2)))**2 == n:
  7.                 ls.append(n)
  8.     return sum(ls),ls


  9. lmt = 1000000
  10. print(split_num(lmt))
  11. #(1507142, [81, 2025, 3025, 9801, 494209, 998001])
复制代码

  1. def split_num(lmt:int):
  2.     from math import log10, ceil
  3.     return sum(n for e in range(2,ceil(log10(lmt))+1,2)
  4.                  for n in range(10**(e-1),10**(e))
  5.                  if sum(divmod(n,10**(e//2)))**2 == n)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-2 10:24:26 | 显示全部楼层
  1. def everyday120(x):
  2.             summ=[]
  3.             for i in range(x):
  4.                         a=len(str(i))
  5.                         if a % 2 != 0:
  6.                                     pass
  7.                         else:
  8.                                     b=10**(a//2)
  9.                                     x=int(i/b)
  10.                                     y=i%b
  11.                                     
  12.                                     if (x+y)**2 == i:
  13.                                                 summ.append(i)
  14.             print(sum(summ),summ)
  15.                                                                                    
  16. everyday120(1000000)      
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-2 10:31:55 | 显示全部楼层
  1. def delOdd(num): #删去3位数和5位数
  2.     if num // 100 in range(1,10) or num// 10000 in range(1,10):
  3.         return False
  4.     return True

  5. # 该数必然是一个平方数,且位数不能是单数
  6. lst = list(filter(delOdd,[x**2 for x in range(4,1000)]))
  7. total = 0
  8. print("1000000以下的雷劈数有:")
  9. for i in lst:
  10.     each = str(i)
  11.     if (int(each[:int(len(each)/2)])+ int(each[int(len(each)/2):]))**2 == i:
  12.         print(i, end = ' ')
  13.         total += i

  14. print('\nsum =',total)
复制代码


结果:
  1. 1000000以下的雷劈数有:
  2. 81 2025 3025 9801 494209 998001
  3. sum = 1507142
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-11-2 12:13:30 | 显示全部楼层
  1. def PingFang(n):
  2.     if (int(n**0.5))**2==n and len(str(n))%2==0 and n==(n//(10**(len(str(n))//2))+n%(10**(len(str(n))//2)))**2:
  3.         return n

  4. x=[]
  5. for i in range(1,1000000):
  6.     if PingFang(i):
  7.         x.append(i)
  8. print(sum(x))
复制代码

应该一行代码就能搞定。。。不过感觉效率好像不高
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-2 15:56:03 | 显示全部楼层
  1. def func(n):
  2.     num_len = int((len(str(n)) -1) / 2)
  3.     for i in range(1, 10**num_len):
  4.         for j in range(1, 10**len(str(i))):
  5.             num = int(str(i)+'0'*(len(str(i))-len(str(j)))+str(j))
  6.             if (i+j)**2 == num:
  7.                 yield num
  8.                
  9. print(sum(func(1000000)))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-2 16:03:35 | 显示全部楼层
昨天看到一个题,主要是解题思路非常巧妙。
发你看看,如下:
如何定义一个Python函数,对给到的一个set或list,如:
set(1, 2, 3, 5, 6, 7, 8)
进行操作,判断连续的数字范围并分块,再返回如下字符串:
"1-3, 5-8"
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-2 17:49:06 From FishC Mobile | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-11-2 17:51 编辑
bush牛 发表于 2017-11-2 16:03
昨天看到一个题,主要是解题思路非常巧妙。
发你看看,如下:
如何定义一个Python函数,对给到的一个set ...

  1. def conti_sort(a):
  2.   a=sorted(list(a))
  3.   res=str(a[0])
  4.   for i in range(1,len(a)):
  5.     if a[i]!=a[i-1]+1:
  6.       res+='-%d,%d'%(a[i-1],a[i])
  7.   if a[-1]==a[-2]+1:
  8.     res+='-%d'%a[-1]
  9.   return res
  10. print conti_sort(set([1,2,3,5,6,7,9]))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-2 19:51:59 | 显示全部楼层

我的思路和你一样,就是比较前一个和后一个关系。
下面是核心代码,我就觉得他用的enumerate和groupby结合,怎么说呢,就觉得他这个是真“连续”,把连续体现的淋漓尽致。
  1. from itertools import groupby

  2. fun = lambda (i, v): v - i
  3. for k, g in groupby(enumerate(lst), fun):
  4.     print [v for i, v in g]

  5. #由于python3中lambda不支持用括号的方式解压,只能这样写
  6. fun = lambda x: x[1] - x[0]
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-2 20:13:01 | 显示全部楼层
看完自己的代码都笑了。
  1. def sbn(n):
  2.     lst = []
  3.     for i in range(1, n):
  4.         if len(str(i)) % 2 != 0:
  5.             continue
  6.         else:
  7.             if int(str(i)[0:len(str(i))//2]) + int(str(i)[len(str(i))//2:]) ** 2 == i:
  8.                 lst.append(i)
  9.             else:
  10.                 continue
  11.     return lst
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-3 04:32:42 From FishC Mobile | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-11-3 05:31 编辑
bush牛 发表于 2017-11-2 19:51
我的思路和你一样,就是比较前一个和后一个关系。
下面是核心代码,我就觉得他用的enumerate和groupby结 ...


你这段代码并没有满足你的程序要求啊
  1. from itertools import groupby
  2. def conti_sort(lst):
  3.   fun = lambda x: x[1]-x[0]
  4.   for k, g in groupby(enumerate(lst), fun):
  5.     print [v for i, v in g]
  6. conti_sort([2,3,5,6,7,9])
复制代码


除非这样写:
  1. from itertools import groupby
  2. def conti_sort(lst):
  3.   fun = lambda x: x[1]-x[0]
  4.   tmp = []
  5.   for k, g in groupby(enumerate(lst), fun):
  6.      tmp.append([v for i, v in g])
  7.   for each in tmp:
  8.      print ('%d-%d'%(each[0],each[-1]) if len(each)>1 else each[0], end=', ')
  9. conti_sort([2,3,5,6,7,9])
复制代码

但是总觉得这样写太累赘,原本的程序一次循环也可以解决了,代码的复杂度也低。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-3 10:37:10 | 显示全部楼层
bush牛 发表于 2017-11-2 16:03
昨天看到一个题,主要是解题思路非常巧妙。
发你看看,如下:
如何定义一个Python函数,对给到的一个set ...

我看到这个题的第一想法就是用reduce函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-3 11:54:25 | 显示全部楼层
jerryxjr1220 发表于 2017-11-3 04:32
你这段代码并没有满足你的程序要求啊

嗯嗯。。知道这个没满足要求。
主要是我从这个看到了一个思路(可能也是我见不多识不广)。
判断一串是否为连续,还是分段连续,可以用这个去比较一个连续的。
======      ==========      =============(一串)
==================================(一串)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-3 12:16:21 | 显示全部楼层
bush牛 发表于 2017-11-3 11:54
嗯嗯。。知道这个没满足要求。
主要是我从这个看到了一个思路(可能也是我见不多识不广)。
...

错位相减就知道连续性了阿~
  1. ls=[1, 2, 3, 5, 6, 7, 8, 10, 11, 12]
  2. print('-'.join([str(ls[0])]+['%d,%d'%(i,x)for i,x in zip(ls[:-1],ls[1:])
  3.                                           if x-i!=1]+[str(ls[-1])]))
  4. #'1-3,5-8,10-12'
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-3 14:27:43 From FishC Mobile | 显示全部楼层
SixPy 发表于 2017-11-3 12:16
错位相减就知道连续性了阿~

这个写法比较溜!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-3 14:47:03 | 显示全部楼层

这题用 pymprog 怎么解?

ABCD_produce.jpg

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

使用道具 举报

发表于 2017-11-3 16:00:38 | 显示全部楼层
本帖最后由 王天豹 于 2017-11-3 16:11 编辑
  1. l=[]
  2. for i in range(1000000):
  3.         i=str(i)
  4.         b=len(i)
  5.         c=int(b/2)
  6.         if b%2==0:
  7.                 x=i[:c]
  8.                 y=i[c:]
  9.                 if (int(x)+int(y))**2==int(i):
  10.                         l.append(int(i))
  11. print(sum(l))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-3 19:15:23 | 显示全部楼层
def split_num(lmt:int):
    from math import log10, ceil
    ls = []
    for e in range(2,ceil(log10(lmt))+1,2):
        for n in range(10**(e-1),10**(e)):
            if sum(divmod(n,10**(e//2)))**2 == n:
                ls.append(n)
    return sum(ls),ls


lmt = 1000000
print(split_num(lmt))
#(1507142, [81, 2025, 3025, 9801, 494209, 998001])

评分

参与人数 1鱼币 -1 收起 理由
SixPy -1 抄袭

查看全部评分

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

使用道具 举报

发表于 2017-11-3 20:25:30 | 显示全部楼层
l=[]
for i in range(1,1000000):
    if i >9 and i<100:
        if (i//10+i%10)**2==i:
            l.append(i)
    elif i >999 and i <10000:
        if (i//100+i%100)**2==i:
            l.append(i)
    elif i >99999 and i <1000000:
        if (i//1000+i%1000)**2==i:
            l.append(i)
print(l)
print(sum(l))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-11-4 05:29:50 From FishC Mobile | 显示全部楼层
SixPy 发表于 2017-11-3 14:47
这题用 pymprog 怎么解?

应该不难解,回去试试看。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 20:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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