鱼C论坛

 找回密码
 立即注册
查看: 4344|回复: 32

[技术交流] 找一个特殊的9位数

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

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

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

x
本帖最后由 jerryxjr1220 于 2017-6-14 12:46 编辑

刚好在刷题时看到这题,比较简单,也比较有趣,可以拿来练手。

这个9位数由1~9的9个数字组成, 每个数字只能出现一次:其第一位能被1整除, 前两位能被2整除, 前三位能被3整除...依次类推,前9位能被9整除。所有的9位数中,只有一个数字满足这些条件,请你输出这个9位数。


调动积极性,回复代码给奖励哦!

本帖被以下淘专辑推荐:

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

使用道具 举报

发表于 2017-6-14 12:50:43 | 显示全部楼层
第一位是从个位开始还是从最高位开始?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-14 13:33:28 | 显示全部楼层

回帖奖励 +5 鱼币

  1. import itertools
  2. s = ''
  3. a = itertools.permutations(range(1,10),9)
  4. for i in a :
  5.     for j in range(9):
  6.         s += str(i[j])
  7.         if int(s) % (j+1) != 0 :
  8.             s = ''
  9.             break      
  10.     if len(s) == 9 :
  11.         print s
  12.         break
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-14 13:47:13 | 显示全部楼层
天空圣域 发表于 2017-6-14 12:50
第一位是从个位开始还是从最高位开始?

第一位是指高位,第9位才是个位。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-14 14:13:02 | 显示全部楼层

回帖奖励 +5 鱼币

根据给定条件,2、4、6、8位为偶数,则剩下的只能是奇数,同时第5位只能是5
  1. import itertools, functools
  2. for i in itertools.permutations([1,3,7,9],4):
  3.     for j in itertools.permutations([2, 4, 6, 8], 4):
  4.         num = functools.reduce(lambda x, y: 10 * x + y, [i[0], j[0], i[1], j[1], 5, j[2], i[2], j[3], i[3]])
  5.         n = 9
  6.         while n > 2:
  7.             if num //(10 ** (9 - n)) % n:
  8.                 break
  9.             n -= 1
  10.         else:
  11.             print(num)
复制代码

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
ooxx7788 + 2 + 2 回复完发现你在我前面,感觉自己好多余啊!

查看全部评分

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

使用道具 举报

发表于 2017-6-14 14:47:11 | 显示全部楼层
我来收录一下,嘿嘿。一觉醒来,3楼已经给了做法了。我再来说些可以减少计算量的东西。不过本身跑的已经够快了,改进不改进也就那么回事儿了,算是个马后炮。

我能想到的有以下两条:
1,数字为1-9,第五位可以给5除,那么必然是   nnnn5nnnn      n for num
  1. 可以在第三行后面插入,我测试过,可以缩短到原来的1/4-1/5的时间
  2. a = filter(lambda x: x[4] == 5, a)
复制代码

2,偶数位可以被偶数整除,那么必然是  oeoe5oeoe         o  for odd , e for even
然后我自己试了下,用filter筛除不符合的数字,时间反而会变长,所以这里就不放代码了。我想如果要缩短时间,应该直接在构造permutations时候,就做好才好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-14 17:14:15 | 显示全部楼层
ooxx7788 发表于 2017-6-14 14:47
我来收录一下,嘿嘿。一觉醒来,3楼已经给了做法了。我再来说些可以减少计算量的东西。不过本身跑的已经够 ...

我们考虑的优化方法是一样的,不知有没有更好的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2017-6-14 17:28:36 | 显示全部楼层

回帖奖励 +5 鱼币

冬雪雪冬 发表于 2017-6-14 17:14
我们考虑的优化方法是一样的,不知有没有更好的。

其实还有一些,不过我觉得意义不是特别大,所以就没说。
比如说,3,4位组成的数字必须是4的倍数。
还有7的倍数也有数字特征。
如果不使用itertools库的情况下面,这些特征应该有意义,因为可以减少很多用于生成验证数字的迭代循环的次数。直接用库以后,价值感觉不高。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-15 14:25:30 | 显示全部楼层
我的是用的基础的内置的函数,第一位能被1整除,可能性是1-9,
然后判断一次判断前num位的对应条件,
利用not k%num来判断前num位数字可以被num整除,
利用len(set(str(k))) == num 来判断前num位置的数字没有重复,

  1. a = [1,2,3,4,5,6,7,8,9]

  2. for num in range(2,10):
  3.     n = len(a)
  4.     for i in range(n):
  5.         for j in range(1,10):
  6.             k = a[0]*10 +j               
  7.             if not k % num and len(set(str(k))) == num:
  8.                 a.append(k)            
  9.         a.remove(a[0])
  10.         
  11. print(a)
复制代码


方法有点笨,但是知识点简单
撤~,观摩大佬们的代码去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-15 14:55:24 | 显示全部楼层
Teagle 发表于 2017-6-15 14:25
我的是用的基础的内置的函数,第一位能被1整除,可能性是1-9,
然后判断一次判断前num位的对应条件,
利 ...

可以的,不知道你是不是意识到其实你使用了广度优先搜索算法,如果改a[0]为a[-1],就可以转换成深度优先搜索。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-15 15:08:33 | 显示全部楼层
jerryxjr1220 发表于 2017-6-15 14:55
可以的,不知道你是不是意识到其实你使用了广度优先搜索算法,如果改a[0]为a[-1],就可以转换成深度优先 ...

经您这么一说,发现确实是广度优先,我再想想深度优先去,感谢大佬指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-6-15 15:09:56 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2017-6-15 16:16 编辑
Teagle 发表于 2017-6-15 14:25
我的是用的基础的内置的函数,第一位能被1整除,可能性是1-9,
然后判断一次判断前num位的对应条件,
利 ...


仿造你的格式写的深度优先搜索算法
  1. a = [9, 8, 7, 6, 5, 4, 3, 2, 1]
  2. while a:
  3.         p = a.pop()
  4.         if len(str(p)) == 9:
  5.                 print(p)
  6.                 break
  7.         for i in range(9,0,-1):
  8.                 if str(i) not in str(p) and (p * 10 + i) % len(str(p * 10 + i)) == 0:
  9.                         a.append(p * 10 + i)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-15 16:07:54 | 显示全部楼层

回帖奖励 +5 鱼币

jerryxjr1220 发表于 2017-6-15 15:09
仿造你的格式写的深度优先搜索算法

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

使用道具 举报

发表于 2017-6-15 20:09:57 | 显示全部楼层
来个 新人看不懂系列
  1. from itertools import (accumulate as acc,
  2.                        chain,
  3.                        permutations as perm,
  4.                        product)

  5. tuple(filter(lambda t:len(t)==9,[tuple(filter(lambda x:x[1]%x[0]==0,enumerate(acc(filter(None,chain(*zip(filter(None,chain(*zip(a,(0,5,0,0)))),list(b)+[0]))),lambda x,y:x*10+y),1)))for a,b in product(perm((1,3,7,9)),perm((2,4,6,8)))]))[0][8][1]
复制代码
  1. 381654729
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-15 20:22:40 | 显示全部楼层

回帖奖励 +5 鱼币

SixPy 发表于 2017-6-15 20:09
来个 新人看不懂系列

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

使用道具 举报

 楼主| 发表于 2017-6-15 20:33:56 | 显示全部楼层
SixPy 发表于 2017-6-15 20:09
来个 新人看不懂系列

版主去挑战一下挑战赛的题吧
http://bbs.fishc.com/thread-88937-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-15 23:53:15 | 显示全部楼层

这样也不错哎
  1. s = ''.join(map(str,a[i][:j+1])))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-6-16 15:58:24 | 显示全部楼层
SixPy 发表于 2017-6-15 20:09
来个 新人看不懂系列

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

使用道具 举报

发表于 2017-6-16 17:57:35 | 显示全部楼层
SixPy 发表于 2017-6-15 20:09
来个 新人看不懂系列

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

使用道具 举报

发表于 2017-6-16 18:37:24 | 显示全部楼层
  1. import itertools as it

  2. result = 0
  3. p = it.permutations([str(i) for i in range(10)], 9)

  4. for each in p:
  5.     flag = True
  6.     for i in range(1, 10):
  7.         if int(''.join(each[:i])) % i != 0:
  8.             flag = False
  9.             break
  10.     if flag and each[0] != '0':
  11.         result = int(''.join(each[:i]))
  12.         break

  13. print(result)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-19 11:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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