你好啊 发表于 2014-9-13 10:45:49

C语言十个数取其中N个数,具体戳进来

本帖最后由 风之残月 于 2014-11-9 22:39 编辑

定义一个 a当取其中10个数的时候有1种情况

当取其中9个数的时候有10种情况
当取其中8个数的时候有45种情况
...
...
当取其中4个数的时候有210种情况

定义一个 b[?][?]
把这些情况全部赋值到 b[?][?]

我想了很久。。尝试for循环里for循环   结果把自己绕晕了:cry
求指点指点~~

friendan 发表于 2014-9-13 10:45:50

本帖最后由 friendan 于 2014-9-14 14:25 编辑

效果截图:


------------------------------------------------------------------
代码:
// TestCpp.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"

#include "stdio.h"

int a[] = {1,2,3,4,5,6,7,8,9,0};      // 定义一个 a
#define N10   // 10个数
#define M1    // 取M个数,M是动态的1到10,这里初始化为1
int queue = {0}; // 每产生一种情况,就保存一种情况
int top = 0;

int iIndex = 0;
int b = {0};            // 定义一个b,因为不知道有多少种情况,所有第二列能大就大吧,这里是1000


// 递归遍历所有情况
void comb(int s, int n, int m)
{
    int i;
    if (s > n)
      return ;

    if (top == m)   // 获得一种
    {
      for (i = 0; i < m; i++)
      {
            b = queue;      // 结果放入b
      }
      return ;
    }

    queue = a;
    comb(s+1, n, m);
    top--;
    comb(s+1, n, m);
}


//组合算法
int GetCount(int n, int m)
{
    // 求n的阶乘
    int iN = 1;
    int i = 0;
    for(i = 1; i<= n ;i++)
    {
      iN = iN*i;
    }

    //求m的阶乘
    int iM = 1;
    for(i = 1; i<= m ;i++)
    {
      iM = iM*i;
    }

    //求n-m的阶乘
    int iNM = 1;
    for(i = 1; i<= (n-m) ;i++)
    {
      iNM = iNM*i;
    }

    // 打印计算结果
    //printf("iN = %2d,iM = %-7d, iNM = %d \n", iN, iM, iNM);

    // 返回计算结果
    return iN / (iM*iNM);
}


void ShowB(int idx, int count)
{
    int lie = 0;
    for(int i = 0; i < count; i++)
    {
      for(int j = 0; j < (idx+1); j++)
         printf("%d", b);
      printf("\t");
    }
}

int main(int argc, char* argv[])
{
    int i = 0;
    for(i = 10; i >= 1; i--)    // 获取所有情况
    {
      iIndex = 0;
      comb(0, N, i);
    }

    // 遍历结果
    for(i = 10; i >= 1; i--)
    {
      int count = GetCount(N, i);
      printf("\n取%d个数的%d种可能: \n", i, count);
      ShowB(i-1, GetCount(N, i));
    }

    getchar();// 暂停程序
    return 0;
}




漠水 发表于 2014-9-13 12:03:13

本帖最后由 漠水 于 2014-9-13 12:09 编辑

这是数学题,还有冒泡函数的问题,数列组合问题(小的阶层除以大的阶层)这是组合问题,然后定义二维数组不能b[?[?],你可以定义一个大的空间,如b然后把所需要的用循环打出来,你可以先把这个拆分这作试试

你好啊 发表于 2014-9-13 14:29:08

漠水 发表于 2014-9-13 12:03
这是数学题,还有冒泡函数的问题,数列组合问题(小的阶层除以大的阶层)这是组合问题,然后定义二维数组不 ...

这是求排列组合的总数
int C(int n,int m)                        //n个数中取m个数有几种可能
{
        int c;
        for (c = 1; m != 0; n--,m--)
        {
                c = c*n / m;
        }
        return c;
}
然后把每种情况都列举出来..还是没头绪比如10个数取6个不重复的数...要六个for循环吗 = =

friendan 发表于 2014-9-13 17:08:25

效果截图:

-----------------------------------------------------------------
程序代码

#include<stdio.h>

//组合算法
// 组合C(n,m)=P(n,m)/P(m,m) =n!/m!(n-m)!£»
// 例如A(4,2)=4!/2!=4*3=12
// C(4,2)=4!/(2!*2!)=4*3/(2*1)=6
int GetCount(int n, int m)
{
        // 求n的阶乘
        int iN = 1;
        int i = 0;
        for(i = 1; i<= n ;i++)
        {
                iN = iN*i;
        }

        //求m的阶乘
        int iM = 1;
        for(i = 1; i<= m ;i++)
        {
                iM = iM*i;
        }

        //求n-m的阶乘
        int iNM = 1;
        for(i = 1; i<= (n-m) ;i++)
        {
                iNM = iNM*i;
        }

        // 打印计算结果
        //printf("iN = %2d,iM = %-7d, iNM = %d \n", iN, iM, iNM);

        // 返回计算结果
        return iN / (iM*iNM);
}



int main(int argc, char* argv[])
{
        // 计算数组a
        int a = {1,2,3,4,5,6,7,8,9,10};

        intb;        // 数组b

        // 把所有情况放入b
        int iIndex = 0;
        int i = 0;
        for(i=10; i >= 1; i--)
        {
                b = GetCount(10, i);
        }

        // 打印结果
        iIndex = 0;
        for(i=10; i >= 1; i--)
        {
                printf("取%2d个数的时候,有%-3d种情况 \n", i, b);
        }

        return 0;
}


你好啊 发表于 2014-9-13 17:46:56

friendan 发表于 2014-9-13 17:08
效果截图:

-----------------------------------------------------------------


{:9_239:}是要把每种情况的排列都赋值到 b 数组里比如取4个数据的时候有210种,那就把这210种情况都赋值到 b 数组里,最后把所有情况全都赋值进去

牡丹花下死做鬼 发表于 2014-9-14 10:10:15

看来楼主数学不行这个用概率就 SO EASY了

漠水 发表于 2014-9-15 12:11:54

你可以分模块做
(1)单个组合你可以试试先将做出0~9的组合,将0和123456789互换,然后1和23456789互换,依次类推,知道9结束,这就是所有的结果,每次都输入到数组中,
(2)判定组合,如何将所需的数字取出,进行组合操作,比如1234,01245等等
(3)。。。。。
(4)。。。。
具体操作我没试过,希望对你有帮助
页: [1]
查看完整版本: C语言十个数取其中N个数,具体戳进来