Python: 每日一题 120
首先我们的玩法做了一下改变:1. 楼主不再提供答案。
2. 请大家先独立思考,再参考各位大神的答案,这样才有助于提高自己的编程水平。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。
题目: 雷劈数
3025是个很有意思的数字,把3025从中间一分为二可以得到30和25,而把30和25相加得到55,其平方正好等于3025。我们把3025这样的数称为雷劈数。
试着找出所有1000000以下的雷劈数,它们的和是多少? 本帖最后由 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)
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) 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 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))
应该一行代码就能搞定。。。不过感觉效率好像不高 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))) 昨天看到一个题,主要是解题思路非常巧妙。
发你看看,如下:
如何定义一个Python函数,对给到的一个set或list,如:
set(1, 2, 3, 5, 6, 7, 8)
进行操作,判断连续的数字范围并分块,再返回如下字符串:
"1-3, 5-8" 本帖最后由 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()) 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):
#由于python3中lambda不支持用括号的方式解压,只能这样写
fun = lambda x: x - x 看完自己的代码都笑了。
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 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):
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()
但是总觉得这样写太累赘,原本的程序一次循环也可以解决了,代码的复杂度也低。 bush牛 发表于 2017-11-2 16:03
昨天看到一个题,主要是解题思路非常巧妙。
发你看看,如下:
如何定义一个Python函数,对给到的一个set ...
我看到这个题的第一想法就是用reduce函数 jerryxjr1220 发表于 2017-11-3 04:32
你这段代码并没有满足你的程序要求啊
嗯嗯。。知道这个没满足要求。
主要是我从这个看到了一个思路(可能也是我见不多识不广{:10_266:})。
判断一串是否为连续,还是分段连续,可以用这个去比较一个连续的。
====== ========== =============(一串)
==================================(一串) 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' SixPy 发表于 2017-11-3 12:16
错位相减就知道连续性了阿~
这个写法比较溜!{:10_254:} jerryxjr1220 发表于 2017-11-3 14:27
这个写法比较溜!
这题用 pymprog 怎么解?
本帖最后由 王天豹 于 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)) 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, ) 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)) SixPy 发表于 2017-11-3 14:47
这题用 pymprog 怎么解?
应该不难解,回去试试看。
页:
[1]
2