鱼C论坛

 找回密码
 立即注册
查看: 3932|回复: 17

[已解决]一道奥数题

[复制链接]
发表于 2016-7-6 10:58:37 | 显示全部楼层 |阅读模式

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

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

x
有这么一道奥数题现有数字0.14.5.6.7六个数字,任意组合一个4位数,求最大能被3除尽的数字是多少?

我这样写,不知道错哪了?
  1. x = 1
  2. list_test = [0,1,4,5,6,7]
  3. while x < 8000:
  4.     if (x % 3):
  5.         for i in str(x):
  6.             if i in list_test:
  7.                 print(x)
  8.     x += 1
复制代码
最佳答案
2016-7-6 13:52:44
我用两个思路写的,你看看。
  1. x = 7654
  2. list_test = ['0','1','4','5','6','7']
  3. while x > 999:
  4.     if (x % 3 == 0) and len(set(str(x))) == 4 and set([i for i in str(x)]) < set(list_test):
  5.         print(x)
  6.         break

  7.     x -= 1
复制代码

  1. str1= '765410'
  2. for i1 in str1:
  3.     str2 = str1.replace(i1, '')
  4.     for i2 in str2:
  5.         str3 = str2.replace(i2, '')
  6.         for i3 in str3:
  7.             str4 = str3.replace(i3, '')
  8.             for i4 in str4:
  9.                 i = i1 + i2 +i3 +i4
  10.                 if int(i) % 3 == 0:
  11.                     print(i)
  12.                     exit()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-7-6 12:17:45 | 显示全部楼层
不亏是奥数题,我也没有懂啊,而且越改越错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-6 13:52:44 | 显示全部楼层    本楼为最佳答案   
我用两个思路写的,你看看。
  1. x = 7654
  2. list_test = ['0','1','4','5','6','7']
  3. while x > 999:
  4.     if (x % 3 == 0) and len(set(str(x))) == 4 and set([i for i in str(x)]) < set(list_test):
  5.         print(x)
  6.         break

  7.     x -= 1
复制代码

  1. str1= '765410'
  2. for i1 in str1:
  3.     str2 = str1.replace(i1, '')
  4.     for i2 in str2:
  5.         str3 = str2.replace(i2, '')
  6.         for i3 in str3:
  7.             str4 = str3.replace(i3, '')
  8.             for i4 in str4:
  9.                 i = i1 + i2 +i3 +i4
  10.                 if int(i) % 3 == 0:
  11.                     print(i)
  12.                     exit()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-6 14:15:55 | 显示全部楼层
list1 = "765410"

for i in list1:
    for j in list1:
        for k in list1:
            for n in list1:
                x = i+j+k+n
                y += 1
                if int(x)%3 == 0:
                    print(x)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-6 19:10:12 | 显示全部楼层
冬雪雪冬 发表于 2016-7-6 13:52
我用两个思路写的,你看看。

谢谢了,递归的方法效率更高一些。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-6 19:12:43 | 显示全部楼层
475378094 发表于 2016-7-6 14:15
list1 = "765410"

for i in list1:

所有符合条件的都输出了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-6 19:24:40 | 显示全部楼层
楼主能附上下递归的代码么?一起学习下,想看看你们的编程思路。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-7 07:38:22 | 显示全部楼层
grapegirl 发表于 2016-7-6 19:24
楼主能附上下递归的代码么?一起学习下,想看看你们的编程思路。

看2喽
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-7 08:41:42 | 显示全部楼层
冬雪雪冬 发表于 2016-7-6 13:52
我用两个思路写的,你看看。

求注释下,新人看不懂
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-7 13:58:50 | 显示全部楼层
diyxx 发表于 2016-7-7 08:41
求注释下,新人看不懂

程序1基本按你原来的思路。
  1. x = 7654 #最大值就是7654,从这个作为起点
  2. list_test = ['0','1','4','5','6','7']
  3. while x > 999: #最终值为1000,题目要求的是四位数
  4.     if (x % 3 == 0) and len(set(str(x))) == 4 and set([i for i in str(x)]) < set(list_test):
  5.     如果 x能被3整除  且       是四位不相同的数     且   这四个数在list_test之内           
  6.         print(x)
  7.         break

  8.     x -= 1
复制代码


程序2:用四重循环将str1的数字组合,每使用一个循环就从str1中剪掉一个数字,避免使用重复数字。再判断能否被3整除。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-7 17:20:11 | 显示全部楼层
冬雪雪冬 发表于 2016-7-6 13:52
我用两个思路写的,你看看。

大神麻烦问一下你第一个方案中的set([i for i in str(x)]) < set(list_test)
这个条件是什么意思?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-7 20:01:48 | 显示全部楼层
aozhenlh 发表于 2016-7-7 17:20
大神麻烦问一下你第一个方案中的set() < set(list_test)
这个条件是什么意思?

[i for i in str(x)]将4位数变成一个字符串列表,再用set变成集合。
集合运算中 < 表示前面后后面的子集,即前面集合所有元素都在后面集合中。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-7 20:59:28 | 显示全部楼层
  1. import itertools
  2. n=itertools.permutations ([0,1,4,5,6,7],4)
  3. result=[x for x in n if sum(x)%3==0]
  4. print(result.pop())
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-7 21:29:27 | 显示全部楼层

sum(x)的想法非常巧妙!
1000a+100b+10c+d = 999a+99b+9c+a+b+c+d
999a+99b+9c肯定能被3整除,只要a+b+c+d能被3整除即可。不过程序还可进一步优化。
  1. import itertools, time
  2. n=itertools.permutations ([7, 6 ,5, 4, 1, 0],4)
  3. for x in n:
  4.     if sum(x) % 3 == 0:
  5.         print(x)
  6.         break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-13 14:43:41 | 显示全部楼层
aozhenlh 发表于 2016-7-6 19:12
所有符合条件的都输出了

我是想在print(x)后就直接结束循环,只输出一个结果,但是不知道怎么结束
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-13 20:17:16 | 显示全部楼层
475378094 发表于 2016-7-13 14:43
我是想在print(x)后就直接结束循环,只输出一个结果,但是不知道怎么结束

可以把所有符合条件的x放进一个列表a里,然后print(max(a))
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-14 20:09:24 | 显示全部楼层
本帖最后由 shuofxz 于 2016-7-14 20:10 编辑
475378094 发表于 2016-7-13 14:43
我是想在print(x)后就直接结束循环,只输出一个结果,但是不知道怎么结束


14楼已经给出相当不错的程序了,
  1. n=itertools.permutations ([7, 6 ,5, 4, 1, 0],4)
复制代码

因为这行代码的作用,在执行的时候会从最大的数开始计算,找到的第一个符合条件的数,即为最大的数
不过输出是这样的(7, 6, 5, 0)

如果想要输出组合起来的数字,有很多方法可实现,我写了一个比较拙劣的方法,仅供参考
  1. import itertools, time
  2. n=itertools.permutations ([7, 6 ,5, 4, 1, 0],4)
  3. sumN = 0
  4. for x in n:
  5.     if sum(x) % 3 == 0:
  6.         #print(x)
  7.         for i in range(1, len(x)+1):
  8.             sumN += x[i-1] * (10**(len(x)-i))
  9.         print(sumN)
  10.         break
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-14 22:31:25 | 显示全部楼层
这种题绝对是写程序没有口算快,7650啊,如果数字可以重复就是7776
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-21 14:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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