| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1606 人关注过本帖
标题:小妹有个问题请教大家, c 语言怎么求组合啊, 分全给你们了
只看楼主 加入收藏
御坂美琴
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:魔術の禁書目錄
等 级:小飞侠
威 望:9
帖 子:952
专家分:2929
注 册:2010-8-18
收藏
得分:6 
int next_combination(int* pArray, int nLen, int nSel)
{
    if (pArray[nLen - 1] + 1 < nSel)
    {
        ++pArray[nLen - 1];
        return 1;
    }
    else
    {
        int it = 2;
        while (it <= nLen && pArray[nLen - it] + it == nSel)
            ++it;
        if (it <= nLen)
        {
            int i;
            pArray[nLen - it]++;
            for (i = nLen - it + 1; i < nLen; ++i )
            {
                pArray[i] = pArray[i - 1] + 1;
            }
            return 1;
        }
        else
        {
            return 0;
        }
    }
}

#include <stdio.h>

int main()
{
    int arrmap[] = {1, 2, 3, 4, 5};
    int arr[] = {0, 1, 2};
    do
    {
        int i;
        for (i = 0; i < 3; ++i)
        {
            printf("%d ", arrmap[arr[i]]);
        }
        puts("");
    } while (next_combination(arr, 3, 5));
    return 0;
}

无重复组合计算
next_combination的参数是:
第一个是长度至少为n的数组,
第二个写n
第三个写m
计算m个里面选n个的组合,那个数组事先需要初始化为0,1,2,3...的形式
然后,next_combination函数每调用一次,就得到下一个组合
arrmap是用来把0 - n-1 映射到你需要的数值用的

永远为正义而奋斗,锄强扶弱的Level 5 超能力者
とある魔術の禁書目錄インデックス__御み坂さか美み琴こと
http://bbs.bccn.net/space.php?action=threads&uid=483997
2011-01-03 12:27
zhaoya881010
Rank: 9Rank: 9Rank: 9
来 自:芒砀古郡
等 级:蜘蛛侠
威 望:1
帖 子:339
专家分:1177
注 册:2010-11-21
收藏
得分:6 
选择应改有很多种我看了一下结果,简单的方法穷举法改良:
程序代码:
#include<stdio.h>
int main(int argc,char**argv)
{
    int a,b,c;
    for(a=1;a<=5;a++)
        for(b=1;b<=5;b++)
        {
            if(b==a)continue;
            for(c=1;c<=5;c++)
            {
                if(c==b||c==a)continue;
                printf("%d,%d,%d\n",a,b,c);
            }
        }
}
结果:
图片附件: 游客没有浏览图片的权限,请 登录注册







Go Go Go
2011-01-03 12:39
SpeedStar
Rank: 2
等 级:论坛游民
帖 子:24
专家分:29
注 册:2010-12-26
收藏
得分:0 
以下是引用御坂美琴在2011-1-3 12:27:55的发言:

int next_combination(int* pArray, int nLen, int nSel)
{
    if (pArray[nLen - 1] + 1 < nSel)
    {
        ++pArray[nLen - 1];
        return 1;
    }
    else
    {
        int it = 2;
        while (it <= nLen && pArray[nLen - it] + it == nSel)
            ++it;
        if (it <= nLen)
        {
            int i;
            pArray[nLen - it]++;
            for (i = nLen - it + 1; i < nLen; ++i )
            {
                pArray = pArray + 1;
            }
            return 1;
        }
        else
        {
            return 0;
        }
    }
}
 
#include  
 
int main()
{
    int arrmap[] = {1, 2, 3, 4, 5};
    int arr[] = {0, 1, 2};
    do
    {
        int i;
        for (i = 0; i < 3; ++i)
        {
            printf("%d ", arrmap[arr]);
        }
        puts("");
    } while (next_combination(arr, 3, 5));
    return 0;
}
 
无重复组合计算
next_combination的参数是:
第一个是长度至少为n的数组,
第二个写n
第三个写m
计算m个里面选n个的组合,那个数组事先需要初始化为0,1,2,3...的形式
然后,next_combination函数每调用一次,就得到下一个组合
arrmap是用来把0 - n-1 映射到你需要的数值用的
你这代码太先进了,我一时半会看不懂~~
2011-01-03 12:43
SpeedStar
Rank: 2
等 级:论坛游民
帖 子:24
专家分:29
注 册:2010-12-26
收藏
得分:0 
能不能根据下面这个图 深搜一下让小妹学学
图片附件: 游客没有浏览图片的权限,请 登录注册
2011-01-03 12:45
zhaoya881010
Rank: 9Rank: 9Rank: 9
来 自:芒砀古郡
等 级:蜘蛛侠
威 望:1
帖 子:339
专家分:1177
注 册:2010-11-21
收藏
得分:0 
不重复更简单:
程序:
程序代码:
#include<stdio.h>
int main(int argc,char**argv)
{
    int a,b,c;
    for(a=1;a<=5;a++)
        for(b=a+1;b<=5;b++)
            for(c=b+1;c<=5;c++)
                printf("%d,%d,%d\n",a,b,c);
}
结果:
图片附件: 游客没有浏览图片的权限,请 登录注册


Go Go Go
2011-01-03 13:20
w123012306
Rank: 9Rank: 9Rank: 9
来 自:湖南
等 级:蜘蛛侠
威 望:4
帖 子:307
专家分:1180
注 册:2010-4-22
收藏
得分:6 
很好!

楼上,楼下的一定要幸福开心哦!
2011-01-03 13:35
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:6 
以下是引用SpeedStar在2011-1-3 11:00:19的发言:

{ 1, 2, 3, 4, 5 } 选3个数的组合 怎么编程啊?
小妹, 组合很难的,我都不一定搞的出来~~~

我就是真命天子,顺我者生,逆我者死!
2011-01-03 16:10
BlueGuy
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:29
帖 子:4476
专家分:4055
注 册:2009-4-18
收藏
得分:0 
以下是引用zhaoya881010在2011-1-3 12:39:00的发言:

选择应改有很多种我看了一下结果,简单的方法穷举法改良:#include
int main(int argc,char**argv)
{
    int a,b,c;
    for(a=1;a<=5;a++)
        for(b=1;b<=5;b++)
        {
            if(b==a)continue;
            for(c=1;c<=5;c++)
            {
                if(c==b||c==a)continue;
                printf("%d,%d,%d\n",a,b,c);
            }
        }
}结果:
你的图显然不对吗,

我就是真命天子,顺我者生,逆我者死!
2011-01-03 16:47
alwaysfocus
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:25
专家分:138
注 册:2010-12-15
收藏
得分:6 
15楼正解
2011-01-03 17:16
hoovi
Rank: 2
等 级:论坛游民
帖 子:12
专家分:34
注 册:2010-11-3
收藏
得分:6 
楼主,你是买彩票的吧
2011-01-03 18:33
快速回复:小妹有个问题请教大家, c 语言怎么求组合啊, 分全给你们了
数据加载中...
 
   



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

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