鱼C论坛

 找回密码
 立即注册
查看: 7094|回复: 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 编辑
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])
def split_num(lmt:int):
    from math import log10, ceil
    return sum(n 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)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

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

print('\nsum =',total)

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

使用道具 举报

发表于 2017-11-2 12:13:30 | 显示全部楼层
def PingFang(n):
    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:
        return n

x=[]
for i in range(1,1000000):
    if PingFang(i):
        x.append(i)
print(sum(x))
应该一行代码就能搞定。。。不过感觉效率好像不高
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-2 15:56:03 | 显示全部楼层
def func(n):
    num_len = int((len(str(n)) -1) / 2)
    for i in range(1, 10**num_len):
        for j in range(1, 10**len(str(i))):
            num = int(str(i)+'0'*(len(str(i))-len(str(j)))+str(j))
            if (i+j)**2 == num:
                yield num
                
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 ...

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

使用道具 举报

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

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

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

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

使用道具 举报

发表于 2017-11-2 20:13:01 | 显示全部楼层
看完自己的代码都笑了。
def sbn(n):
    lst = []
    for i in range(1, n):
        if len(str(i)) % 2 != 0:
            continue
        else:
            if int(str(i)[0:len(str(i))//2]) + int(str(i)[len(str(i))//2:]) ** 2 == i:
                lst.append(i)
            else:
                continue
    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结 ...


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

除非这样写:
from itertools import groupby
def conti_sort(lst):
  fun = lambda x: x[1]-x[0]
  tmp = []
  for k, g in groupby(enumerate(lst), fun):
     tmp.append([v for i, v in g])
  for each in tmp:
     print ('%d-%d'%(each[0],each[-1]) if len(each)>1 else each[0], end=', ')
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
嗯嗯。。知道这个没满足要求。
主要是我从这个看到了一个思路(可能也是我见不多识不广)。
...

错位相减就知道连续性了阿~
ls=[1, 2, 3, 5, 6, 7, 8, 10, 11, 12]
print('-'.join([str(ls[0])]+['%d,%d'%(i,x)for i,x in zip(ls[:-1],ls[1:])
                                          if x-i!=1]+[str(ls[-1])]))
#'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 编辑
l=[]
for i in range(1000000):
        i=str(i)
        b=len(i)
        c=int(b/2)
        if b%2==0:
                x=i[:c]
                y=i[c:]
                if (int(x)+int(y))**2==int(i):
                        l.append(int(i))
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, 2025-1-12 06:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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