鱼C论坛

 找回密码
 立即注册
查看: 3788|回复: 37

[已解决]今日一题

[复制链接]
发表于 2020-8-6 10:59:54 | 显示全部楼层 |阅读模式
30鱼币
本帖最后由 永恒的蓝色梦想 于 2020-8-6 11:33 编辑

描述:
给定 N 个 1 位数字。对于所有 X <= N,用其中任意 X 个数字都可以组合成 1 个 X 位的数字。要求所有可能组合出来的 X 位数字的和。例如给定 2、5、8,则可以组合出:2、5、8、25、28、52、58、82、85、258、285、528、582、825、852,它们的和为 3675。

输入格式:
在一行中给出 N 个可能重复的 1 位数字,以空格分隔。保证 N > 0 。

输出格式:
所有可能组合出来的 X 位数字的和。

要求:
禁止使用暴力解法。

本题灵感来自于 https://fishc.com.cn/forum.php?mod=viewthread&tid=176899
最佳答案
2020-8-6 10:59:55
LZXXXXX 发表于 2020-8-9 12:13
刚学编程,当习题练练手了,暴力不暴力的我就不懂了
以2 5 8为例,思路是用排列数公式分别算三位 ...

兄弟思路差不多,但这个思路有个致命问题:如何判断0不在第一位

附上我的代码,当时我就想到这个问题才把我的回复给编辑了
  1. from math import factorial

  2. nums = tuple(ord(i) - 48 for i in input().split())
  3. basic = sum(nums)
  4. n, digit = len(nums), 0
  5. result = [0]
  6. while digit < n:
  7.     temp = result[-1] * (n - digit)
  8.     temp += basic * pow(10, digit) * factorial(n - 1) // factorial(n - digit - 1)
  9.     result.append(temp)
  10.     digit += 1
  11. print(result)
  12. print(sum(result))
复制代码

最佳答案

查看完整内容

兄弟思路差不多,但这个思路有个致命问题:如何判断0不在第一位 附上我的代码,当时我就想到这个问题才把我的回复给编辑了

本帖被以下淘专辑推荐:

  • · 题库|主题: 10, 订阅: 3
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-6 10:59:55 | 显示全部楼层    本楼为最佳答案   
LZXXXXX 发表于 2020-8-9 12:13
刚学编程,当习题练练手了,暴力不暴力的我就不懂了
以2 5 8为例,思路是用排列数公式分别算三位 ...

兄弟思路差不多,但这个思路有个致命问题:如何判断0不在第一位

附上我的代码,当时我就想到这个问题才把我的回复给编辑了
  1. from math import factorial

  2. nums = tuple(ord(i) - 48 for i in input().split())
  3. basic = sum(nums)
  4. n, digit = len(nums), 0
  5. result = [0]
  6. while digit < n:
  7.     temp = result[-1] * (n - digit)
  8.     temp += basic * pow(10, digit) * factorial(n - 1) // factorial(n - digit - 1)
  9.     result.append(temp)
  10.     digit += 1
  11. print(result)
  12. print(sum(result))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-6 11:34:37 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-8-10 10:50 编辑

暴力程序:
  1. from itertools import chain, permutations


  2. def parse(tup, /) -> int:
  3.     result = 0

  4.     for i in tup:
  5.         result = result * 10 + i

  6.     return result


  7. nums = tuple(ord(i) - 48 for i in input().split())

  8. print(sum(set(map(parse, chain.from_iterable(permutations(nums, length) for length in range(len(nums), 0, -1))))))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-6 16:15:48 | 显示全部楼层

我还真不会

但是我发现你用的是3.8
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-6 17:23:40 | 显示全部楼层
陈尚涵 发表于 2020-8-6 16:15
我还真不会

但是我发现你用的是3.8

哦?怎么发现的?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-6 17:25:17 | 显示全部楼层

就凭这段代码:
  1. def parse(tup, /) -> int:
复制代码


我可是知道3.8加的新特性
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-6 17:26:38 | 显示全部楼层

噢,确实是
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-6 17:27:35 | 显示全部楼层
本帖最后由 陈尚涵 于 2020-8-6 17:28 编辑


你还不知道Python3.8函数末尾加"/"的意思是必须传参数
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-6 17:29:37 | 显示全部楼层

我好像说错了什么
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-6 17:31:50 | 显示全部楼层

不是,Python3.8加反斜杠没有用,配合*才有用,只不过是一种习惯
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-6 17:32:24 | 显示全部楼层
陈尚涵 发表于 2020-8-6 17:27
你还不知道Python3.8函数末尾加"/"的意思是必须传参数

我又不傻,而且不懂不要瞎说好吧:
https://www.zhihu.com/question/287097169/answer/637396902
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-6 17:34:45 | 显示全部楼层
陈尚涵 发表于 2020-8-6 17:31
不是,Python3.8加反斜杠没有用,配合*才有用,只不过是一种习惯

请不要胡说。
  1. >>> def a(arg):
  2.     return arg

  3. >>> a(6)
  4. 6
  5. >>> a(arg=6)
  6. 6
  7. >>> def b(arg, /):
  8.     return arg

  9. >>> b(6)
  10. 6
  11. >>> b(arg=6)
  12. Traceback (most recent call last):
  13.   File "<pyshell#7>", line 1, in <module>
  14.     b(arg=6)
  15. TypeError: b() got some positional-only arguments passed as keyword arguments: 'arg'
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-6 17:35:12 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-6 17:32
我又不傻,而且不懂不要瞎说好吧:
https://www.zhihu.com/question/287097169/answer/637396902

貌似有点健忘学习到了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-7 14:08:11 | 显示全部楼层
一天了貌似没人
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-7 15:09:16 | 显示全部楼层
本帖最后由 March2615 于 2020-8-7 18:31 编辑

太菜了,想知道答案
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-8 16:02:51 | 显示全部楼层
March2615 发表于 2020-8-7 15:09
太菜了,想知道答案

我发的求助帖啊我就是来求助的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-8 17:02:27 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-8-6 17:32
我又不傻,而且不懂不要瞎说好吧:
https://www.zhihu.com/question/287097169/answer/637396902

故意想要和大佬搭讪
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-8 17:02:50 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-8-8 18:05 编辑
超过光速c 发表于 2020-8-8 17:02
故意想要和大佬搭讪


……企业级理解
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-9 00:45:05 | 显示全部楼层
  1. import copy


  2. def cartesian_product(test_list):
  3.     r = len(test_list)
  4.     trip_str = "!"
  5.     test_list_str = [str(i) for i in test_list] + [trip_str] * (r - 1)
  6.     pools = [tuple(test_list_str)] * r
  7.     result = [[]]
  8.     for pool in pools:
  9.         pre_result = copy.deepcopy(result)
  10.         result.clear()
  11.         for x in pre_result:
  12.             for y in pool:
  13.                 if x.count(y) < test_list_str.count(y):
  14.                     result.append(x + [y])
  15.     for prod in result:
  16.         prod_str = "".join(prod).strip(trip_str)
  17.         if trip_str not in prod_str:
  18.             yield prod_str


  19. nums = tuple(ord(i) - 48 for i in input().split())
  20. print(sum(set([int(s) for s in cartesian_product(nums) if s])))
复制代码

经过测试应该没有问题
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-9 01:22:46 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-20 02:44

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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