鱼C论坛

 找回密码
 立即注册
查看: 3666|回复: 7

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

[复制链接]
发表于 2014-9-13 10:45:49 | 显示全部楼层 |阅读模式
2鱼币
本帖最后由 风之残月 于 2014-11-9 22:39 编辑

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

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

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

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

最佳答案

查看完整内容

效果截图: ------------------------------------------------------------------ 代码:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-13 10:45:50 | 显示全部楼层
本帖最后由 friendan 于 2014-9-14 14:25 编辑

效果截图:
QQ截图20140913170637.png

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

  3. #include "stdafx.h"

  4. #include "stdio.h"

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

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


  12. // 递归遍历所有情况
  13. void comb(int s, int n, int m)
  14. {
  15.     int i;
  16.     if (s > n)
  17.         return ;

  18.     if (top == m)   // 获得一种
  19.     {
  20.         for (i = 0; i < m; i++)
  21.         {
  22.             b[m-1][iIndex++] = queue[i];        // 结果放入b
  23.         }
  24.         return ;
  25.     }

  26.     queue[top++] = a[s];
  27.     comb(s+1, n, m);
  28.     top--;
  29.     comb(s+1, n, m);
  30. }


  31. //组合算法
  32. int GetCount(int n, int m)
  33. {
  34.     // 求n的阶乘
  35.     int iN = 1;
  36.     int i = 0;
  37.     for(i = 1; i<= n ;i++)
  38.     {
  39.         iN = iN*i;
  40.     }

  41.     //求m的阶乘
  42.     int iM = 1;
  43.     for(i = 1; i<= m ;i++)
  44.     {
  45.         iM = iM*i;
  46.     }

  47.     //求n-m的阶乘
  48.     int iNM = 1;
  49.     for(i = 1; i<= (n-m) ;i++)
  50.     {
  51.         iNM = iNM*i;
  52.     }

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

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


  58. void ShowB(int idx, int count)
  59. {
  60.     int lie = 0;
  61.     for(int i = 0; i < count; i++)
  62.     {
  63.         for(int j = 0; j < (idx+1); j++)
  64.          printf("%d", b[idx][lie++]);
  65.         printf("\t");
  66.     }
  67. }

  68. int main(int argc, char* argv[])
  69. {
  70.     int i = 0;
  71.     for(i = 10; i >= 1; i--)    // 获取所有情况
  72.     {
  73.         iIndex = 0;
  74.         comb(0, N, i);
  75.     }

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

  83.     getchar();  // 暂停程序
  84.     return 0;
  85. }

复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-13 12:03:13 | 显示全部楼层
本帖最后由 漠水 于 2014-9-13 12:09 编辑

这是数学题,还有冒泡函数的问题,数列组合问题(小的阶层除以大的阶层)这是组合问题,然后定义二维数组不能b[?[?],你可以定义一个大的空间,如b[1000][10]然后把所需要的用循环打出来,你可以先把这个拆分这作试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

这是求排列组合的总数
  1. int C(int n,int m)                        //n个数中取m个数有几种可能
  2. {
  3.         int c;
  4.         for (c = 1; m != 0; n--,m--)
  5.         {
  6.                 c = c*n / m;
  7.         }
  8.         return c;
  9. }
复制代码

然后把每种情况都列举出来..还是没头绪比如10个数取6个不重复的数...要六个for循环吗 = =
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-13 17:08:25 | 显示全部楼层
效果截图: QQ截图20140913170637.png

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

  1. #include<stdio.h>

  2. //组合算法
  3. // 组合C(n,m)=P(n,m)/P(m,m) =n!/m!(n-m)!£&#187;
  4. // 例如A(4,2)=4!/2!=4*3=12
  5. // C(4,2)=4!/(2!*2!)=4*3/(2*1)=6
  6. int GetCount(int n, int m)
  7. {
  8.         // 求n的阶乘
  9.         int iN = 1;
  10.         int i = 0;
  11.         for(i = 1; i<= n ;i++)
  12.         {
  13.                 iN = iN*i;
  14.         }

  15.         //求m的阶乘
  16.         int iM = 1;
  17.         for(i = 1; i<= m ;i++)
  18.         {
  19.                 iM = iM*i;
  20.         }

  21.         //求n-m的阶乘
  22.         int iNM = 1;
  23.         for(i = 1; i<= (n-m) ;i++)
  24.         {
  25.                 iNM = iNM*i;
  26.         }

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

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



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

  36.         int  b[10][10];        // 数组b

  37.         // 把所有情况放入b
  38.         int iIndex = 0;
  39.         int i = 0;
  40.         for(i=10; i >= 1; i--)
  41.         {
  42.                 b[iIndex++][0] = GetCount(10, i);
  43.         }

  44.         // 打印结果
  45.         iIndex = 0;
  46.         for(i=10; i >= 1; i--)
  47.         {
  48.                 printf("取%2d个数的时候,有%-3d种情况 \n", i, b[iIndex++][0]);
  49.         }

  50.         return 0;
  51. }
复制代码



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-9-13 17:46:56 | 显示全部楼层
friendan 发表于 2014-9-13 17:08
效果截图:

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

是要把每种情况的排列都赋值到 b 数组里  比如取4个数据的时候有210种,那就把这210种情况都赋值到 b[2000][10] 数组里,最后把所有情况全都赋值进去
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-14 10:10:15 | 显示全部楼层
看来楼主数学不行这个用概率就 SO EASY了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-9-15 12:11:54 | 显示全部楼层
你可以分模块做
(1)单个组合你可以试试先将做出0~9的组合,将0和123456789互换,然后1和23456789互换,依次类推,知道9结束,这就是所有的结果,每次都输入到数组中,
(2)判定组合,如何将所需的数字取出,进行组合操作,比如1234,01245等等
(3)。。。。。
(4)。。。。
具体操作我没试过,希望对你有帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-21 14:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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