鱼C论坛

 找回密码
 立即注册
查看: 4527|回复: 11

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

[复制链接]
发表于 2017-6-10 14:55:42 | 显示全部楼层 |阅读模式

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

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

x
吸血鬼解释:1994年柯利弗德·皮寇弗在Usenet社群sci.math的文章中首度提出吸血鬼数。后来皮寇弗将吸血鬼数写入他的书Keys to Infinity的第30章。

吸血鬼数字是指位数为偶数的数字,可以由一对数字相乘而得到,而这对数字各包含乘积的一半位数的数字,其中从最初的数字中选取的数字可以任意排序。

例如:
  1. 1260 = 21 * 60
  2. 1827 = 21 * 87
复制代码


那么,找出10000以下的吸血鬼数字吧。

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-6-10 15:52:18 | 显示全部楼层
本帖最后由 冬雪雪冬 于 2017-6-10 15:55 编辑

好像两位数没有解
  1. from itertools import permutations as per
  2. for i in range(1000, 10000):
  3.     for j in per(str(i), 4):
  4.         x = ''.join(j[:2])
  5.         y = ''.join(j[2:])
  6.         if i == int(x) * int(y):
  7.             print('%d = %s * %s'%(i, x, y))
  8.             break
复制代码

  1. 1260 = 21 * 60
  2. 1395 = 15 * 93
  3. 1435 = 41 * 35
  4. 1530 = 51 * 30
  5. 1827 = 87 * 21
  6. 2187 = 27 * 81
  7. 6880 = 86 * 80
复制代码

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

使用道具 举报

发表于 2017-6-10 17:24:19 | 显示全部楼层
  1. from itertools import permutations as  perms
  2. for x in range(1000,10000):
  3.     for a,b,c,d in perms(map(int, str(x))):
  4.         y,z = (a*10+b),(c*10+d)
  5.         if y * z == x:
  6.             print('%d = %d * %d'%(x, y, z))
  7.             break
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-10 18:45:47 From FishC Mobile | 显示全部楼层
  1. print set([x*y for x in range(10,100) for y in range(10,100) if sorted(list(str(x)+str(y)))==sorted(list(str(x*y)))])
复制代码


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

使用道具 举报

发表于 2017-6-10 20:26:58 | 显示全部楼层

不错,还可以继续优化~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-11 08:07:27 | 显示全部楼层
  1. {x*y:(x,y) for x in range(10,100)
  2.            for y in range(10,100)
  3.            if x*y>999 and sorted(str(x*100+y))==sorted(str(x*y))}
复制代码
  1. {1260: (60, 21),
  2. 1395: (93, 15),
  3. 1435: (41, 35),
  4. 1530: (51, 30),
  5. 1827: (87, 21),
  6. 2187: (81, 27),
  7. 6880: (86, 80)}
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-11 22:56:32 | 显示全部楼层

写的忒好,学到很多,感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-19 19:36:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-27 21:21:35 | 显示全部楼层
写完看看前面,感觉自己怎么写得这么长··· ···
另外,真是佩服jerry大神,每次都能找着不一样的思路

碰到偶数位的数字就拆一半,把全排列过一遍
  1. # 可以将排除范围加快,遇到奇数位直接 *10
  2. def find_v_num(n):
  3.     result = []
  4.     i = 1260
  5.     while i <= n:
  6.         length = len(str(i))
  7.         if length %2:
  8.             i*=10
  9.         else:
  10.             for j in set(itertools.permutations(str(i))):
  11.                 if int("".join(j[:length//2]))*int("".join(j[length//2:])) == i:
  12.                     result.append(i)
  13.                     break
  14.             i += 1
  15.     return result
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-17 23:03:39 | 显示全部楼层
import random
import itertools
def vampire(n):
    num = set()
    for j in range(n):
        n1 = list(str(j))
        #print(n1)
        n2 = len(n1)
        #random.random.choices()
        if n2 % 2 == 0:
            for  i in itertools.permutations(n1):
                if (i[n2 // 2 - 1]) == 0 and (i[n2 -1] == 0):
                    continue
                elif int(i[n2 // 2 - 1]) * int(i[n2 - 1]) != int(n1[n2 - 1]):
                    continue
                elif int("".join(i[:n2//2])) * int("".join(i[n2//2:n2])) == j:
                    print(j, "=", int("".join(i[:n2//2])), "*", int("".join(i[n2//2:n2])))
                    num.add(j)
                else:
                    continue
    print(num)
        #for i in range(len(n1)):
            #for j in range
        #n   
            
        #num_list = []
        
vampire(10000)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-4-18 15:02:54 | 显示全部楼层
  1. res=['%d=%d*%d' %(x1*x2,x1,x2) for x1 in range(10,100) for x2 in range(x1,100) if sorted(str(x1*x2))==sorted(str(x1)+str(x2))]
  2. print('\n'.join(res))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-22 10:26:43 | 显示全部楼层

我感觉主要是因为吸血鬼数字必须是一对数相乘得到,而且这对数必须各包含乘积一半位数的数字。当结果是两位数时,在10--20之间,这对数字其中一个必须包含1,这就意味着另一个必须是两位数;当结果是20-29时,其中一个必须是2,这也就意味着另一个数字必须是两位数。以此类推,两位数的吸血鬼数字不存在
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 07:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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