鱼C论坛

 找回密码
 立即注册
查看: 9171|回复: 48

[技术交流] Python:每日一题 127

[复制链接]
发表于 2017-11-23 19:24:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 冬雪雪冬 于 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的平方。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-23 20:46:30 | 显示全部楼层
没写出来QAQ
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 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)[0::2])) == sum(map(int,str(power)[1::2])):
        print(power)
    num += 1

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 2 反对 0

使用道具 举报

发表于 2017-11-23 21:22:11 | 显示全部楼层
import itertools as itrs
for n in itrs.permutations(range(10),8):
        if n[0]==0:continue
        if sum(n[::2]) != sum(n[1::2]):continue
        n = sum(m*10**i for i,m in enumerate(reversed(n)))
        if divmod(n**0.5,1)[1]:continue
        print(n)

        
10673289
13498276
19847025
20738916
32970564
57108249
68973025
86397025
>>> 

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-11-23 21:46:55 | 显示全部楼层
from itertools import permutations
for each in permutations(range(10),8):
        if each[0]==0: continue
        if sum(each[0::2])==sum(each[1::2]) and int(''.join([str(e) for e in each]))**0.5==int(int(''.join([str(e) for e in each]))**0.5):
                print(int(''.join([str(e) for e in each])))
10673289
13498276
19847025
20738916
32970564
57108249
68973025
86397025

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[i:i+1]
                        b.append(e)
            if len(set(b))==8:
                        c=''
                        b = list(map(int,b))
                        if sum(b[1::2])==sum(b[0::2]):
                                    for x in b:
                                                c=c+str(x)
                                    int(c)
                                    print(c)
                                                
                                                
                                    

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[1::2]):
                num1.append(i) #如果符合要求则存放进来
print(num1)
输出结果:
[10673289, 13498276, 19847025, 20738916, 32970564, 57108249, 68973025, 86397025]

我刚学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[1::2]): #奇数位和偶数位数字之和相同
            numgoal.append(num) #如果符合要求则存放进来
print(numgoal)     

结果是一样的

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

点评

我很赞同!: 5.0
我很赞同!: 5
写得很666啊!  发表于 2017-11-24 09:14

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 一行完成

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-24 09:51:44 | 显示全部楼层
from math import sqrt
lst = [x*x for x in range(int(sqrt(1e7) + 1),int(sqrt(1e8)))]

for each in lst:
    temp = str(each)
    if len(set(list(temp))) == 8 and sum(map(int, temp[::2])) == sum(map(int, temp[1::2])):
        print(each, end = ' ')

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 = [i for i in r if math.sqrt(int(i)).is_integer()]
    r3 = [v for v in r2 if sum(int(i) for i in v[::2]) == sum(int(i) for i in v[1::2])]
    return r3

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[0])+int(numbers[2])+int(numbers[4])+int(numbers[6])!=\
       int(numbers[1])+int(numbers[3])+int(numbers[5])+int(numbers[7]):
        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 = [int(x) for x in list(str(number))]
        digits1 = allDigits[::2]  
        digits2 = allDigits[1::2]
        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秒钟就出结果了。看来,写代码之前还是要多思考思考思路,如果耗时太大,一定是思路错了。

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-24 15:24:49 | 显示全部楼层
第一次做这个,我用了迭代方法,而且函数还是网上照抄的。
代码:
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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-24 16:09:09 | 显示全部楼层
[13498276, 19847025, 20738916, 32970564, 57108249, 68973025, 86397025, 103754596]
def findnums(num):
    while 1:
        a = list(str(num))
        if len(set(a))==8:
            if ((num**0.5)%1)==0:
                if sum([int(x) for x in a[::2]]) == sum([int(x) for x in a[1::2]]):
                    return num
        num+=1


if __name__ == '__main__':
        num=12345677
        result = []
        while num < 99999999:
            num = findnums(num+1)
            result.append(num)
        print(result)

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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'[0-9]',s))) == 8:
                        if int(s[0])+int(s[2])+int(s[4])+int(s[6]) == int(s[1]) + int(s[3]) + int(s[5]) + int(s[7]) :
                                print('end:',s)
end: 10673289
end: 13498276
end: 19847025
end: 20738916
end: 32970564
end: 57108249
end: 68973025
end: 86397025
[Finished in 63.1s]

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[1::2])
        if o == e:
            print(x, i, list(int(i) for i in x[::2]), list(int(i) for i in x[1::2]), e)


10673289 3267 [1, 6, 3, 8] [0, 7, 2, 9] 18
13498276 3674 [1, 4, 8, 7] [3, 9, 2, 6] 20
19847025 4455 [1, 8, 7, 2] [9, 4, 0, 5] 18
20738916 4554 [2, 7, 8, 1] [0, 3, 9, 6] 18
32970564 5742 [3, 9, 0, 6] [2, 7, 5, 4] 18
57108249 7557 [5, 1, 8, 4] [7, 0, 2, 9] 18
68973025 8305 [6, 9, 3, 2] [8, 7, 0, 5] 20
86397025 9295 [8, 3, 7, 2] [6, 9, 0, 5] 20

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[i])
        else: # even
            even += int(list_n[i])
    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[0] 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 = [1,2,3,4,5,6,7,8,9,0]
    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
'''

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-24 22:02:02 | 显示全部楼层
for each in range(int(10000000**0.5),int(100000000**0.5)):
    list_num = [int(x) for x in str(each**2)]
    list_num_char = [x for x in str(each**2)]
    if len(set(list_num)) == len(list_num):
        if sum(list_num[::2]) == sum(list_num[1::2]):
            print(''.join(list_num_char))

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-11-24 23:45:52 | 显示全部楼层
print([i**2 for i in range(int(10000000 ** 0.5) + 1, int(100000000 ** 0.5)) if len(set(str(i ** 2))) == 8 and sum(int(j) for j in str(i ** 2)[::2]) == sum(int(j) for j in str(i ** 2)[1::2])])

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[0:7:2])) == sum(map(int, str[1:8:2]))): # 判断 第一个条件是否满足
        return 1 # if true
    else:
        return 0 # if false
'''
真正的main函数, 就TMD二行, 吃瓜, 其实只有一行
'''
n =[n for n in range(10 ** 7, (10 ** 8) -1) if (isAllSquare(n) and pythonic(n))]
print(n)
'''
ps: 将近9千9百万 的 配置 搞不定
pss : 垃圾
'''

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
冬雪雪冬 + 2 + 2 注意效率

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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荣誉 +3 鱼币 +3 收起 理由
冬雪雪冬 + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 03:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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