| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2866 人关注过本帖
标题:数学排列组合问题
只看楼主 加入收藏
虾B写
Rank: 8Rank: 8
来 自:湖北
等 级:蝙蝠侠
威 望:3
帖 子:395
专家分:922
注 册:2009-10-1
结帖率:100%
收藏
已结贴  问题点数:100 回复次数:31 
数学排列组合问题
将标号为1.2.3.4.5.6的6张卡片放入3个不同的信封,若每个信封放2张,有多少种放法
先给出数学解法,再给出程序(^o^)
搜索更多相关主题的帖子: 数学 
2011-06-06 23:41
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:35 
c(6, 2) * c(4, 2) == 6 * 5 / 2 * 4 * 3 / 2 == 90

程序代码:
#include <stdio.h>

int c(int n, int m) {
    int i, r = 1;
    for (i = n; i > n - m; r *= i--);
    for (i = m; i > 1; r /= i--);
    return r;
}

int main() {
    printf("%d\n", c(6, 2) * c(4, 2));
    return 0;
}


最丑最暴力的代码:

程序代码:
#include <stdio.h>

int main() {
    char e[3] = {0}, c[6] = {0}, i, cnt = 0;
    for (c[0] = 0; c[0] < 3; c[0]++) {
        if (e[c[0]] < 2) {
            e[c[0]]++;
                for (c[1] = 0; c[1] < 3; c[1]++) {
                    if (e[c[1]] < 2) {
                        e[c[1]]++;
                        for (c[2] = 0; c[2] < 3; c[2]++) {
                            if (e[c[2]] < 2) {
                                e[c[2]]++;
                                for (c[3] = 0; c[3] < 3; c[3]++) {
                                    if (e[c[3]] < 2) {
                                        e[c[3]]++;
                                        for (c[4] = 0; c[4] < 3; c[4]++) {
                                            if (e[c[4]] < 2) {
                                                e[c[4]]++;
                                                for (c[5] = 0; c[5] < 3; c[5]++) {
                                                    if (e[c[5]] < 2) {
                                                        for (i = 0; i < 6; i++) {
                                                            if (c[i] == 0) {
                                                                printf("%d ", i);
                                                            }
                                                        }
                                                        printf("| ");
                                                        for (i = 0; i < 6; i++) {
                                                            if (c[i] == 1) {
                                                                printf("%d ", i);
                                                            }
                                                        }
                                                        printf("| ");
                                                        for (i = 0; i < 6; i++) {
                                                            if (c[i] == 2) {
                                                                printf("%d ", i);
                                                            }
                                                        }
                                                        printf("\n");
                                                        cnt++;
                                                    }
                                                }
                                                e[c[4]]--;
                                            }
                                        }
                                        e[c[3]]--;
                                    }
                                }
                                e[c[2]]--;
                            }
                        }
                        e[c[1]]--;
                    }
                }
            e[c[0]]--;
        }
    }
    printf("%d\n", cnt);
    return 0;
}


[ 本帖最后由 voidx 于 2011-6-7 00:36 编辑 ]
2011-06-06 23:44
loveshuang
Rank: 9Rank: 9Rank: 9
来 自:湖北武汉
等 级:蜘蛛侠
帖 子:270
专家分:1198
注 册:2010-11-14
收藏
得分:10 
C(3,1)*C(6,2)*C(2,1)*C(4,2)*C(1,1)*C(2,2);
知道公式了程序只是小菜了。楼主明白的。
2011-06-06 23:47
loveshuang
Rank: 9Rank: 9Rank: 9
来 自:湖北武汉
等 级:蜘蛛侠
帖 子:270
专家分:1198
注 册:2010-11-14
收藏
得分:0 
回复 2楼 voidx
这个代码果然很暴力。。。
2011-06-07 07:39
虾B写
Rank: 8Rank: 8
来 自:湖北
等 级:蝙蝠侠
威 望:3
帖 子:395
专家分:922
注 册:2009-10-1
收藏
得分:0 
我只交过学费,没读过书,不知道公式,不会用,所以不知道3楼的结果。
我算的是奇数的*积,不知道对否。
2/1=1
4/2 =1*3=3
6/3  =1*3*5=15
8/4 =1*3*5*7=105
10/5=1*3*5*7*9=945
12/6=1*3*5*7*9*11=945*11
在纸上列出来只有15个,你们是怎么算出15+的







白娘故意下雨骗许仙的伞。祝英台十八里相送时装疯卖傻调戏梁山伯。七仙女挡住了董永的去路。牛郎趁织女洗澡时拿走了她的衣服。。。这些故事告诉我们;伟大爱情的开始,总归的有一个要先耍流氓!
2011-06-07 08:32
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:20 
回复 2楼 voidx
int c(int n, int m) {
     int i, r = 1;
     for (i = n; i > n - m; r *= i--);
     for (i = m; i > 1; r /= i--);
     return r;
 }
这一写法当 p(n, n-m+1)超过整型的范围时结果是错误的。这限制了c(n,m)所能正确计算的范围。
稍修改一下计算过程可以扩大计算范围,提高精度。
int Comb(int n, int m)
{
    int i, j, r = 1;
    for(i = 1, j = n - m + 1; i <= m; i++, j++)
    {
        r *= j;
        r/=i;
    }
    return r;
}

重剑无锋,大巧不工
2011-06-07 08:54
hjywyj
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:3
帖 子:1114
专家分:2611
注 册:2010-4-14
收藏
得分:10 
楼主知道答案是多少吗?
网上有的说是18,有的说几百种,答案是多少??
2011-06-07 09:11
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:0 
我都已经暴力过了,答案就不需要疑惑了吧
2011-06-07 09:24
Toomj
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:257
专家分:1826
注 册:2011-5-17
收藏
得分:5 
这段代码好有型
2011-06-07 10:32
烟雾中的迷茫
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:621
专家分:1069
注 册:2011-2-9
收藏
得分:10 
答案应该是1080=C(6,2)*C(3,1)*C(4,2)*C(2,1)
2011-06-07 11:48
快速回复:数学排列组合问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030911 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved