Python:每日一题 127
本帖最后由 冬雪雪冬 于 2017-11-27 20:29 编辑先我们的玩法做了一下改变:
1. 楼主不再提供答案。
2. 请大家先独立思考”,再参考其他鱼油的解答,这样才有助于自己编程水平的提高。
3. 鼓励大家积极答题,奖励的期限为出题后24小时内。
4. 根据答案的质量给予1~3鱼币的奖励。
题目:
求出这样的8位正整数,同时符合以下要求:1,每一位的数字都不相同。
2,第1,3,5,7位数字之后与第2,4,6,8位数字之和相等。
3,此8位数是完全平方数,即其平方根为整数。
符合条件的数字可能是一个或多个。
以4位数为例:
如4356,每位数都不相同,且4+5=3+6,并且是66的平方。
没写出来QAQ 本帖最后由 yjsx86 于 2017-11-23 21:06 编辑
其实我是很不喜欢把代码写得很紧凑
1,可读性差
2,不便维护
3,性能牺牲不少
运算量少的话就随便了
稍微取个巧 8位数 起始10000000刚好是1000的平方
从1000开始循环取平方,然后就是根据题目要求写判断
再写一个结束循环的判断
num = 1000
while True:
power = num * num
if power > 99999999:
break
if len(set(str(power))) == 8 and sum(map(int,str(power))) == sum(map(int,str(power))):
print(power)
num += 1 import itertools as itrs
for n in itrs.permutations(range(10),8):
if n==0:continue
if sum(n[::2]) != sum(n):continue
n = sum(m*10**i for i,m in enumerate(reversed(n)))
if divmod(n**0.5,1):continue
print(n)
10673289
13498276
19847025
20738916
32970564
57108249
68973025
86397025
>>> from itertools import permutations
for each in permutations(range(10),8):
if each==0: continue
if sum(each)==sum(each) and int(''.join())**0.5==int(int(''.join())**0.5):
print(int(''.join()))
10673289
13498276
19847025
20738916
32970564
57108249
68973025
86397025 import math
max=int(math.sqrt(99999999))
min=int(math.sqrt(10000000))
for j in range(min,max):
a=str(j**2)
b=[]
for i in range(8):
e=a
b.append(e)
if len(set(b))==8:
c=''
b = list(map(int,b))
if sum(b)==sum(b):
for x in b:
c=c+str(x)
int(c)
print(c)
本帖最后由 python_techlog 于 2017-11-24 09:12 编辑
import math
num1 = []#定义空列表,存放符合要求的8位数
for i in range(10234567,98765432):
numset = set(map(int,str(i)))
if len(numset) == 8:
if math.sqrt(i)%1 == 0:
numlist = list(map(int,str(i)))
if sum(numlist[::2]) == sum(numlist):
num1.append(i) #如果符合要求则存放进来
print(num1)
输出结果:
我刚学python不到一周,这个要运行好几分钟,求大神指点!
================================================================
又做了调整,速度快多了
import math
numgoal = []#定义空列表,存放符合要求的8位数
for i in range(int(math.sqrt(10234567)),int(math.sqrt(98765432))):
num = i**2#计算开方后是整数的8位数
numlist = list(map(int,str(num))) #将8位数转化为列表
numset = set(numlist)# 将8位数转成集合,如果有重复的数字,集合长度会小于8
if len(numset) == 8:
if sum(numlist[::2]) == sum(numlist): #奇数位和偶数位数字之和相同
numgoal.append(num) #如果符合要求则存放进来
print(numgoal)
结果是一样的 def fun(n):
return [i**2 for i in range(int((10**(n-1))**0.5), int((10**n)**0.5)+1)
if len(set(str(i**2)))==n and sum(int(m)*n for m,n in zip(str(i**2), (1,-1)*n))==0]
print(fun(8)) from math import sqrt
lst =
for each in lst:
temp = str(each)
if len(set(list(temp))) == 8 and sum(map(int, temp[::2])) == sum(map(int, temp)):
print(each, end = ' ') # 没想出什么好的方法,就偷个懒,看看大佬们怎么写。
def func():
import math
from itertools import permutations
s = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'}
r = [''.join(list(i)) for i in permutations(s, 8)]
r2 =
r3 = ) == sum(int(i) for i in v)]
return r3
本帖最后由 shigure_takimi 于 2017-11-28 10:26 编辑
def isTheNumber(n):# n是一个八位数
numbers = list(str(n))
if (n**0.5) % 1 != 0:
return False
elif int(numbers)+int(numbers)+int(numbers)+int(numbers)!=\
int(numbers)+int(numbers)+int(numbers)+int(numbers):
return False
elif len(set(numbers)) == 8:
return True
for i in range(10000000, 100000000):
if isTheNumber(i):
print(i)
所求八位数为: 10673289 其平方根为: 3267.0
所求八位数为: 13498276 其平方根为: 3674.0
所求八位数为: 19847025 其平方根为: 4455.0
所求八位数为: 20738916 其平方根为: 4554.0
所求八位数为: 32970564 其平方根为: 5742.0
所求八位数为: 57108249 其平方根为: 7557.0
所求八位数为: 68973025 其平方根为: 8305.0
所求八位数为: 86397025 其平方根为: 9295.0
一起有8个符合条件的数。Time cost:222.921875 seconds
不知道有没有什么好方法,耗时短些的。
--------------------------------------------------------------------------------------------------------------------------
更新:
def getAllNumbers():
numberList = []
start = int(10000000 ** 0.5)
end = int(100000000 ** 0.5)
for i in range(start, end):
number = i ** 2
allDigits =
digits1 = allDigits[::2]
digits2 = allDigits
if sum(digits1) == sum(digits2) and len(set(allDigits)) == 8:
numberList.append(number)
return numberList
print(getAllNumbers())
#耗时:0.0625秒
之前自己的代码是,通过对10000000到100000000之间的每个数进行验证,有90000000个数,耗时太大。
看了别人的代码,知道了思路。是通过sqrt(10000000)=3163到sqrt(100000000)=10000之间的整数来求对应的八位数,只有6837个数,是原来的13164分之一。
改了代码之后,这样计算量就小多了,不到0.1秒钟就出结果了。看来,写代码之前还是要多思考思考思路,如果耗时太大,一定是思路错了。 第一次做这个,我用了迭代方法,而且函数还是网上照抄的。{:10_266:}
代码:
import math
def isSqr(n):
qwe = int((math.sqrt(n)))
return qwe * qwe == n
q = range(1, 10)
for a in q:
for b in q:
for c in q:
for d in q:
if a != b and a != c and a!= d and b != c and b != d and c != d:
if a + c == b + d :
if 1 == isSqr(a * 1000 + b * 100 + c * 10 + d):
print(a, b, c, d)
还望以后日子多多指教!
答案只有一个:4356
def findnums(num):
while 1:
a = list(str(num))
if len(set(a))==8:
if ((num**0.5)%1)==0:
if sum(]) == sum(]):
return num
num+=1
if __name__ == '__main__':
num=12345677
result = []
while num < 99999999:
num = findnums(num+1)
result.append(num)
print(result)
# -*- coding: utf-8 -*-
import math
import re
def is_sqr(x):
r = int(math.sqrt(x))
return r * r == x
for i in range(10000000,100000000):
if is_sqr(i):
s = str(i)
if len(set(re.findall(r'',s))) == 8:
if int(s)+int(s)+int(s)+int(s) == int(s) + int(s) + int(s) + int(s) :
print('end:',s)
end: 10673289
end: 13498276
end: 19847025
end: 20738916
end: 32970564
end: 57108249
end: 68973025
end: 86397025
本帖最后由 ooxx7788 于 2017-11-25 10:05 编辑
for i in range(3163, 10000):
x = str(i ** 2)
if len(set(list(x))) == 8:
o = sum(int(i) for i in x[::2])
e = sum(int(i) for i in x)
if o == e:
print(x, i, list(int(i) for i in x[::2]), list(int(i) for i in x), e)
10673289 3267 18
13498276 3674 20
19847025 4455 18
20738916 4554 18
32970564 5742 18
57108249 7557 18
68973025 8305 20
86397025 9295 20
def isEqual(n):
list_n = list(str(n))
odd, even = 0,0
for i in range(8):
if i %2 : # odd
odd += int(list_n)
else: # even
even += int(list_n)
if odd == even:
return True
else:
return False
def isPerfectSquare(n):
if abs(round(n ** 0.5) - n ** 0.5) <=0.000001 :
return True
else:
return False
def getthelist(numlist,result_list):
for each in numlist:
the_rest = numlist.copy()
the_rest.remove(each)
result_list.append(each)
getthelist(the_rest,result_list)
if result_list and len(result_list) == 8:
temp = ''
for each in result_list:
temp += str(each)
n = int(temp)
global numOfResult
if isEqual(n):
if isPerfectSquare(n):
print(n)
numOfResult += 1
global count
count += 1
result_list.remove(result_list[-1])
if __name__ == '__main__':
numlist =
result_list = []
count = 0
numOfResult = 0
getthelist(numlist,result_list)
print('count:',count)
print('number of result:',numOfResult)
'''
13498276
19847025
10673289
20738916
32970564
57108249
68973025
86397025
count: 1632960
number of result: 8
'''
for each in range(int(10000000**0.5),int(100000000**0.5)):
list_num =
list_num_char =
if len(set(list_num)) == len(list_num):
if sum(list_num[::2]) == sum(list_num):
print(''.join(list_num_char)) print() == sum(int(j) for j in str(i ** 2))]){:10_247:} 本帖最后由 Da_Ye 于 2017-11-28 10:41 编辑
#!usr/bin/eno python
# -*- coding: UTF-8 -*-
'''
求8位整数:1.第 1 3 5 7 位数 与 第 2 4 6 8 位数之和相等
2.其为完全平方数, 即 其的平方为整数
'''
'''
isAllSquare(n), 判断其是否为完全平方数
是返回1, 否则返回0
'''
def isAllSquare(n):
square = n ** 0.5 # 平方
if str(square).isnumeric: # 判断平方是否是整数
return 1
else:
return 0
'''
pythonic(n) 判断是否满足第一个条件
满足返回 1 否则返回 0
'''
def pythonic(n): # 使满足第一条件
strnum = str(n) # 将int 转换为 str
if(sum(map(int, str)) == sum(map(int, str))): # 判断 第一个条件是否满足
return 1 # if true
else:
return 0 # if false
'''
真正的main函数, 就TMD二行, 吃瓜, 其实只有一行
'''
n =
print(n)
'''
ps: 将近9千9百万 的 配置 搞不定
pss : 垃圾
'''{:10_266:}{:10_266:}{:10_266:}{:10_266:}{:10_266:} import itertools
for i1,i2,i3,i4,i5,i6,i7,i8 in (itertools.permutations('0123456789',8)):
if i1!='0':
if int(i1)+int(i3)+int(i5)+int(i7)==int(i2)+int(i4)+int(i6)+int(i8):
if int(i1+i2+i3+i4+i5+i6+i7+i8)**0.5%1==0:
print(i1,i2,i3,i4,i5,i6,i7,i8)