鱼C论坛

 找回密码
 立即注册
查看: 7623|回复: 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开始循环取平方,然后就是根据题目要求写判断
再写一个结束循环的判断
  1. num = 1000
  2. while True:
  3.     power = num * num
  4.     if power > 99999999:
  5.         break
  6.     if len(set(str(power))) == 8 and sum(map(int,str(power)[0::2])) == sum(map(int,str(power)[1::2])):
  7.         print(power)
  8.     num += 1
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

  8.        
  9. 10673289
  10. 13498276
  11. 19847025
  12. 20738916
  13. 32970564
  14. 57108249
  15. 68973025
  16. 86397025
  17. >>>
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-23 21:46:55 | 显示全部楼层
  1. from itertools import permutations
  2. for each in permutations(range(10),8):
  3.         if each[0]==0: continue
  4.         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):
  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 | 显示全部楼层
  1. import math
  2. max=int(math.sqrt(99999999))
  3. min=int(math.sqrt(10000000))

  4. for j in range(min,max):
  5.             a=str(j**2)
  6.             b=[]
  7.             for i in range(8):
  8.                         e=a[i:i+1]
  9.                         b.append(e)
  10.             if len(set(b))==8:
  11.                         c=''
  12.                         b = list(map(int,b))
  13.                         if sum(b[1::2])==sum(b[0::2]):
  14.                                     for x in b:
  15.                                                 c=c+str(x)
  16.                                     int(c)
  17.                                     print(c)
  18.                                                 
  19.                                                 
  20.                                     
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-24 00:01:00 | 显示全部楼层
本帖最后由 python_techlog 于 2017-11-24 09:12 编辑
  1. import math
  2. num1 = []  #定义空列表,存放符合要求的8位数
  3. for i in range(10234567,98765432):
  4.     numset = set(map(int,str(i)))
  5.     if len(numset) == 8:
  6.         if math.sqrt(i)%1 == 0:
  7.             numlist = list(map(int,str(i)))
  8.             if sum(numlist[::2]) == sum(numlist[1::2]):
  9.                 num1.append(i) #如果符合要求则存放进来
  10. print(num1)
复制代码

输出结果:
[10673289, 13498276, 19847025, 20738916, 32970564, 57108249, 68973025, 86397025]

我刚学python不到一周,这个要运行好几分钟,求大神指点!

================================================================

又做了调整,速度快多了
  1. import math
  2. numgoal = []  #定义空列表,存放符合要求的8位数

  3. for i in range(int(math.sqrt(10234567)),int(math.sqrt(98765432))):
  4.     num = i**2  #计算开方后是整数的8位数
  5.     numlist = list(map(int,str(num))) #将8位数转化为列表
  6.     numset = set(numlist)  # 将8位数转成集合,如果有重复的数字,集合长度会小于8
  7.     if len(numset) == 8:
  8.         if sum(numlist[::2]) == sum(numlist[1::2]): #奇数位和偶数位数字之和相同
  9.             numgoal.append(num) #如果符合要求则存放进来
  10. print(numgoal)     
复制代码


结果是一样的

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-24 07:30:35 | 显示全部楼层
  1. def fun(n):
  2.     return [i**2 for i in range(int((10**(n-1))**0.5), int((10**n)**0.5)+1)
  3.             if len(set(str(i**2)))==n and sum(int(m)*n for m,n in zip(str(i**2), (1,-1)*n))==0]
  4. 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 | 显示全部楼层
  1. from math import sqrt
  2. lst = [x*x for x in range(int(sqrt(1e7) + 1),int(sqrt(1e8)))]

  3. for each in lst:
  4.     temp = str(each)
  5.     if len(set(list(temp))) == 8 and sum(map(int, temp[::2])) == sum(map(int, temp[1::2])):
  6.         print(each, end = ' ')
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-24 12:13:26 | 显示全部楼层
  1. # 没想出什么好的方法,就偷个懒,看看大佬们怎么写。
  2. def func():
  3.     import math
  4.     from itertools import permutations
  5.     s = {'1', '2', '3', '4', '5', '6', '7', '8', '9', '0'}
  6.     r = [''.join(list(i)) for i in permutations(s, 8)]
  7.     r2 = [i for i in r if math.sqrt(int(i)).is_integer()]
  8.     r3 = [v for v in r2 if sum(int(i) for i in v[::2]) == sum(int(i) for i in v[1::2])]
  9.     return r3
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-24 15:18:43 | 显示全部楼层
本帖最后由 shigure_takimi 于 2017-11-28 10:26 编辑
  1. def isTheNumber(n):  # n是一个八位数
  2.     numbers = list(str(n))
  3.     if (n**0.5) % 1 != 0:
  4.         return False
  5.     elif int(numbers[0])+int(numbers[2])+int(numbers[4])+int(numbers[6])!=\
  6.        int(numbers[1])+int(numbers[3])+int(numbers[5])+int(numbers[7]):
  7.         return False
  8.     elif len(set(numbers)) == 8:
  9.         return True

  10. for i in range(10000000, 100000000):
  11.     if isTheNumber(i):
  12.         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
不知道有没有什么好方法,耗时短些的。

--------------------------------------------------------------------------------------------------------------------------
更新:
  1. def getAllNumbers():  
  2.     numberList = []
  3.     start = int(10000000 ** 0.5)
  4.     end = int(100000000 ** 0.5)
  5.     for i in range(start, end):
  6.         number = i ** 2
  7.         allDigits = [int(x) for x in list(str(number))]
  8.         digits1 = allDigits[::2]  
  9.         digits2 = allDigits[1::2]
  10.         if sum(digits1) == sum(digits2) and len(set(allDigits)) == 8:
  11.             numberList.append(number)
  12.     return numberList

  13. print(getAllNumbers())

  14. #耗时: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]

  1. def findnums(num):
  2.     while 1:
  3.         a = list(str(num))
  4.         if len(set(a))==8:
  5.             if ((num**0.5)%1)==0:
  6.                 if sum([int(x) for x in a[::2]]) == sum([int(x) for x in a[1::2]]):
  7.                     return num
  8.         num+=1


  9. if __name__ == '__main__':
  10.         num=12345677
  11.         result = []
  12.         while num < 99999999:
  13.             num = findnums(num+1)
  14.             result.append(num)
  15.         print(result)
复制代码

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-24 18:45:30 | 显示全部楼层
  1. # -*- coding: utf-8 -*-

  2. import math  
  3. import re

  4. def is_sqr(x):  
  5.     r = int(math.sqrt(x))  
  6.     return r * r == x

  7. for i in range(10000000,100000000):
  8.         if is_sqr(i):
  9.                 s = str(i)
  10.                 if len(set(re.findall(r'[0-9]',s))) == 8:
  11.                         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]) :
  12.                                 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 编辑
  1. for i in range(3163, 10000):
  2.     x = str(i ** 2)
  3.     if len(set(list(x))) == 8:
  4.         o = sum(int(i) for i in x[::2])
  5.         e = sum(int(i) for i in x[1::2])
  6.         if o == e:
  7.             print(x, i, list(int(i) for i in x[::2]), list(int(i) for i in x[1::2]), e)
复制代码



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

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-24 19:11:57 | 显示全部楼层
  1. def isEqual(n):
  2.     list_n = list(str(n))
  3.     odd, even = 0,0
  4.     for i in range(8):
  5.         if i %2 : # odd
  6.             odd += int(list_n[i])
  7.         else: # even
  8.             even += int(list_n[i])
  9.     if odd == even:
  10.         return True
  11.     else:
  12.         return False

  13. def isPerfectSquare(n):
  14.     if abs(round(n ** 0.5) - n ** 0.5) <=0.000001 :
  15.         return True
  16.     else:
  17.         return False

  18. def getthelist(numlist,result_list):
  19.     for each in numlist:
  20.         the_rest = numlist.copy()
  21.         the_rest.remove(each)
  22.         result_list.append(each)
  23.         getthelist(the_rest,result_list)
  24.         if result_list[0] and len(result_list) == 8:
  25.             temp = ''
  26.             for each in result_list:
  27.                 temp += str(each)
  28.             n = int(temp)
  29.             global numOfResult
  30.             if isEqual(n):
  31.                 if isPerfectSquare(n):
  32.                     print(n)
  33.                     numOfResult += 1
  34.             global count
  35.             count += 1
  36.         result_list.remove(result_list[-1])

  37. if __name__ == '__main__':
  38.     numlist = [1,2,3,4,5,6,7,8,9,0]
  39.     result_list = []
  40.     count = 0
  41.     numOfResult = 0
  42.     getthelist(numlist,result_list)

  43.     print('count:',count)
  44.     print('number of result:',numOfResult)

  45. '''
  46. 13498276
  47. 19847025
  48. 10673289
  49. 20738916
  50. 32970564
  51. 57108249
  52. 68973025
  53. 86397025
  54. count: 1632960
  55. number of result: 8
  56. '''
复制代码

评分

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

查看全部评分

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

使用道具 举报

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

评分

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

查看全部评分

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

使用道具 举报

发表于 2017-11-24 23:45:52 | 显示全部楼层
  1. 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 编辑
  1. #!usr/bin/eno python
  2. # -*- coding: UTF-8 -*-
  3. '''
  4. 求8位整数:1.第 1 3 5 7 位数 与 第 2 4 6 8 位数之和相等
  5.           2.其为完全平方数, 即 其的平方为整数
  6. '''

  7. '''
  8. isAllSquare(n), 判断其是否为完全平方数
  9.     是返回1, 否则返回0
  10. '''
  11. def isAllSquare(n):
  12.     square = n ** 0.5 # 平方
  13.     if str(square).isnumeric: # 判断平方是否是整数
  14.         return 1
  15.     else:
  16.         return 0
  17. '''
  18. pythonic(n) 判断是否满足第一个条件
  19.     满足返回 1 否则返回 0
  20. '''
  21. def pythonic(n): # 使满足第一条件

  22.     strnum = str(n) # 将int 转换为 str
  23.     if(sum(map(int, str[0:7:2])) == sum(map(int, str[1:8:2]))): # 判断 第一个条件是否满足
  24.         return 1 # if true
  25.     else:
  26.         return 0 # if false
  27. '''
  28. 真正的main函数, 就TMD二行, 吃瓜, 其实只有一行
  29. '''
  30. n =[n for n in range(10 ** 7, (10 ** 8) -1) if (isAllSquare(n) and pythonic(n))]
  31. print(n)
  32. '''
  33. ps: 将近9千9百万 的 配置 搞不定
  34. pss : 垃圾
  35. '''
复制代码

评分

参与人数 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, 2024-3-29 13:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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