鱼C论坛

 找回密码
 立即注册
查看: 180|回复: 9

[已解决]不使用任何模块,计算10抽5的组合

[复制链接]
发表于 2024-8-12 09:39:16 | 显示全部楼层 |阅读模式

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

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

x
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!=e  and 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))

这是最笨的穷举法   但是速度太慢了  可有好的代码
最佳答案
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], 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

可是我最终要的不是 有多少个组合  
而是要这252个具体的组合数 都是什么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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], 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-12 09:47:46 | 显示全部楼层
c++ 欢迎您
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-12 09:49:03 | 显示全部楼层
你是只要长度吗?用数学公式吧。
使用组合枚举的公式,秒算。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-8-12 10:06:39 | 显示全部楼层
学习编程中的Ben 发表于 2024-8-12 09:49
你是只要长度吗?用数学公式吧。
使用组合枚举的公式,秒算。

参看4楼ai答案,速度比穷举 不知道快了多少倍
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-16 12:09:44 | 显示全部楼层
wp231957 发表于 2024-8-12 10:06
参看4楼ai答案,速度比穷举 不知道快了多少倍

有没有可能,四楼就是穷举。。。
其实你的代码稍微改一下就和四楼一样了。
而且公式更快啊。
组合数学你没学吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

就会一个公式  C(M,N)=M!/N!/(M-N)!   别的 都不会
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-8-17 15:30:57 | 显示全部楼层
wp231957 发表于 2024-8-16 13:37
就会一个公式  C(M,N)=M!/N!/(M-N)!   别的 都不会

这一个还不够吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 19:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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