wp231957 发表于 2024-8-12 09:39:16

不使用任何模块,计算10抽5的组合

s=[]
for a in range(0,10):
    for b in range(0,10):
      for c in range(0,10):
            for d in range(10):
                for e in range(10):
                  if a!=b and a!=c and a!=d and a!=e and b!=c and b!=d and b!=e and c!=d and c!=eand d!=e:
                        t=f"{a}{b}{c}{d}{e}"
                        for x in s:
                            if set(list(t))==set(list(x)):
                              break
                        else:
                            s.append(t)   
print(len(s))

这是最笨的穷举法   但是速度太慢了可有好的代码

FishC 发表于 2024-8-12 09:45:29

你的代码确实是一个穷举法,迭代所有可能的数字组合。这种方法在小范围内是可行的,但当范围增大时,计算效率就会变得非常低下。接下来,我给你介绍一种更高效的方法来计算组合。

这里使用组合的一个数学性质:从n个元素中选择k个元素的组合数,可以通过公式 \( C(n, k) = \frac{n!}{k!(n-k)!} \) 计算。在这个例子中,由于你需要生成不重复的5位数字组合,其每位数字在0到9之间,我们可以选用 `0-9` 中的 `5` 个数字进行组合。

下面是快速计算组合数的 Python 代码示例:

def factorial(n):
    if n == 0 or n == 1:
      return 1
    return n * factorial(n - 1)

def combinations_count(n, k):
    return factorial(n) // (factorial(k) * factorial(n - k))

# 计算从10个不同的数字中选择5个数字的组合数
result = combinations_count(10, 5)
print(result)

这个代码中创建了一个简单的阶乘函数和一个计算组合数的函数。通过这个方法,你可以很快得到结果,而不必穷举每一个组合。

当然,运行这段代码的速度要比你的穷举法快得多,因为它只计算了组合的数量,而不需要遍历所有组合。

如果你仍然想要获取具体的组合数字而不是仅仅计算数量,那么可以使用`itertools.permutations`函数(虽然你提到不使用模块,但这个方法效率极高),这样可以更简单地生成这些组合:

import itertools

# 生成所有不重复的5位数字组合
combinations = [''.join(p) for p in itertools.permutations('0123456789', 5)]
print(len(combinations))

这个代码会给你所有的5位不重复数字组合,并且计算速度快得让你不得不怀疑自己是不是在做梦!希望对你有帮助,让你在编程的路上跑得更快,更远!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

wp231957 发表于 2024-8-12 09:47:33

FishC 发表于 2024-8-12 09:45
你的代码确实是一个穷举法,迭代所有可能的数字组合。这种方法在小范围内是可行的,但当范围增大时,计算效 ...

可是我最终要的不是 有多少个组合
而是要这252个具体的组合数 都是什么

FishC 发表于 2024-8-12 09:47:41

wp231957 发表于 2024-08-12 09:47
可是我最终要的不是 有多少个组合
而是要这252个具 ...

没问题!如果你想要获取具体的组合,而不是仅仅计算组合的数量,我们可以使用一个不使用任何模块的方法来生成所有可能的五位数字组合。

我们可以利用递归或循环简单地构建这些组合。以下是实现这一功能的代码:

s = []# 用来存储组合结果

# 创建一个函数,生成不重复数字的组合
def generate_combinations(current_combination, start):
    # 如果组合已经有5个数字,添加到结果列表中
    if len(current_combination) == 5:
      s.append(''.join(map(str, current_combination)))
      return
   
    # 从当前开始遍历数字
    for num in range(start, 10):
      # 添加当前数字到组合中并递归调用
      generate_combinations(current_combination + , num + 1)

# 开始生成组合
generate_combinations([], 0)

# 打印结果和组合数量
print(s)
print("组合总数:", len(s))

### 解释一下代码:
1. `s` 用于存储所有的组合。
2. `generate_combinations` 函数通过递归生成组合:
   - 当 `current_combination` 中已经有 5 个元素时,将其添加到结果列表 `s` 中。
   - 遍历从 `start` 到 9 的数字,确保不重复。
3. 最后,我们调用这个函数,并将结果打印出来。

运行这段代码后,你将得到所有的 252 个不重复的组合,以及它们的数量!

希望这能帮助你顺利获取需要的组合。如果还有其他问题,尽管问我哦!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

学习编程中的Ben 发表于 2024-8-12 09:47:46

c++ 欢迎您

学习编程中的Ben 发表于 2024-8-12 09:49:03

你是只要长度吗?用数学公式吧。
使用组合枚举的公式,秒算。

wp231957 发表于 2024-8-12 10:06:39

学习编程中的Ben 发表于 2024-8-12 09:49
你是只要长度吗?用数学公式吧。
使用组合枚举的公式,秒算。

参看4楼ai答案,速度比穷举 不知道快了多少倍

学习编程中的Ben 发表于 2024-8-16 12:09:44

wp231957 发表于 2024-8-12 10:06
参看4楼ai答案,速度比穷举 不知道快了多少倍

有没有可能,四楼就是穷举。。。
其实你的代码稍微改一下就和四楼一样了。
而且公式更快啊。
组合数学你没学吗?

wp231957 发表于 2024-8-16 13:37:54

学习编程中的Ben 发表于 2024-8-16 12:09
有没有可能,四楼就是穷举。。。
其实你的代码稍微改一下就和四楼一样了。
而且公式更快啊。


就会一个公式C(M,N)=M!/N!/(M-N)!   别的 都不会

学习编程中的Ben 发表于 2024-8-17 15:30:57

wp231957 发表于 2024-8-16 13:37
就会一个公式C(M,N)=M!/N!/(M-N)!   别的 都不会

这一个还不够吗?
页: [1]
查看完整版本: 不使用任何模块,计算10抽5的组合