jerryxjr1220 发表于 2017-11-2 07:08:11

Python: 每日一题 120

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

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

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

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)

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

BngThea 发表于 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,))
total = 0
print("1000000以下的雷劈数有:")
for i in lst:
    each = str(i)
    if (int(each[:int(len(each)/2)])+ int(each))**2 == i:
      print(i, end = ' ')
      total += i

print('\nsum =',total)

结果:
1000000以下的雷劈数有:
81 2025 3025 9801 494209 998001
sum = 1507142

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

应该一行代码就能搞定。。。不过感觉效率好像不高

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

bush牛 发表于 2017-11-2 16:03:35

昨天看到一个题,主要是解题思路非常巧妙。
发你看看,如下:
如何定义一个Python函数,对给到的一个set或list,如:
set(1, 2, 3, 5, 6, 7, 8)
进行操作,判断连续的数字范围并分块,再返回如下字符串:
"1-3, 5-8"

jerryxjr1220 发表于 2017-11-2 17:49:06

本帖最后由 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)
for i in range(1,len(a)):
    if a!=a+1:
      res+='-%d,%d'%(a,a)
if a[-1]==a[-2]+1:
    res+='-%d'%a[-1]
return res
print conti_sort(set())

bush牛 发表于 2017-11-2 19:51:59

jerryxjr1220 发表于 2017-11-2 17:49


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

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

#由于python3中lambda不支持用括号的方式解压,只能这样写
fun = lambda x: x - x

新手·ing 发表于 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)) + int(str(i)) ** 2 == i:
                lst.append(i)
            else:
                continue
    return lst

jerryxjr1220 发表于 2017-11-3 04:32:42

本帖最后由 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-x
for k, g in groupby(enumerate(lst), fun):
    print
conti_sort()

除非这样写:
from itertools import groupby
def conti_sort(lst):
fun = lambda x: x-x
tmp = []
for k, g in groupby(enumerate(lst), fun):
   tmp.append()
for each in tmp:
   print ('%d-%d'%(each,each[-1]) if len(each)>1 else each, end=', ')
conti_sort()
但是总觉得这样写太累赘,原本的程序一次循环也可以解决了,代码的复杂度也低。

colinshi 发表于 2017-11-3 10:37:10

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

我看到这个题的第一想法就是用reduce函数

bush牛 发表于 2017-11-3 11:54:25

jerryxjr1220 发表于 2017-11-3 04:32
你这段代码并没有满足你的程序要求啊




嗯嗯。。知道这个没满足要求。
主要是我从这个看到了一个思路(可能也是我见不多识不广{:10_266:})。
判断一串是否为连续,还是分段连续,可以用这个去比较一个连续的。
======      ==========      =============(一串)
==================================(一串)

SixPy 发表于 2017-11-3 12:16:21

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

错位相减就知道连续性了阿~
ls=
print('-'.join()]+['%d,%d'%(i,x)for i,x in zip(ls[:-1],ls)
                                          if x-i!=1]+)]))
#'1-3,5-8,10-12'

jerryxjr1220 发表于 2017-11-3 14:27:43

SixPy 发表于 2017-11-3 12:16
错位相减就知道连续性了阿~

这个写法比较溜!{:10_254:}

SixPy 发表于 2017-11-3 14:47:03

jerryxjr1220 发表于 2017-11-3 14:27
这个写法比较溜!

这题用 pymprog 怎么解?



王天豹 发表于 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
                if (int(x)+int(y))**2==int(i):
                        l.append(int(i))
print(sum(l))

C和单片机爱好者 发表于 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, )

编程新血 发表于 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))

jerryxjr1220 发表于 2017-11-4 05:29:50

SixPy 发表于 2017-11-3 14:47
这题用 pymprog 怎么解?

应该不难解,回去试试看。
页: [1] 2
查看完整版本: Python: 每日一题 120