冬雪雪冬 发表于 2017-11-23 19:24:55

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的平方。

lyp0620 发表于 2017-11-23 20:46:30

没写出来QAQ

yjsx86 发表于 2017-11-23 20:59:01

本帖最后由 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

SixPy 发表于 2017-11-23 21:22:11

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
>>>

jerryxjr1220 发表于 2017-11-23 21:46:55

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

aegis1417 发表于 2017-11-23 23:27:56

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 00:01:00

本帖最后由 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)   

结果是一样的

solomonxian 发表于 2017-11-24 07:30:35

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))

BngThea 发表于 2017-11-24 09:51:44

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 = ' ')

bush牛 发表于 2017-11-24 12:13:26

# 没想出什么好的方法,就偷个懒,看看大佬们怎么写。
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-24 15:18:43

本帖最后由 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秒钟就出结果了。看来,写代码之前还是要多思考思考思路,如果耗时太大,一定是思路错了。

安生 发表于 2017-11-24 15:24:49

第一次做这个,我用了迭代方法,而且函数还是网上照抄的。{: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

colinshi 发表于 2017-11-24 16:09:09



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)

DKD 发表于 2017-11-24 18:45:30

# -*- 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-24 19:05:22

本帖最后由 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

Elastcio 发表于 2017-11-24 19:11:57

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
'''

wc365 发表于 2017-11-24 22:02:02

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))

第四时空 发表于 2017-11-24 23:45:52

print() == sum(int(j) for j in str(i ** 2))]){:10_247:}

Da_Ye 发表于 2017-11-25 01:40:14

本帖最后由 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:}

编程新血 发表于 2017-11-25 09:05:12

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)
页: [1] 2 3
查看完整版本: Python:每日一题 127