CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

2006年,这个C算法题目,相信在这里能有答案!100分...

楼主doodoosun()2006-12-31 19:29:15 在 C/C++ / C语言 提问

有0,1,2,3,4,5,6,7,8,9共10个数字,分为两组,一组6个,另外一组4个,按照组合的计算共有210种不同的分组方法。现需要编一个程序(C语言)实现这个功能  
   
    将分好组的数据存放在数组int   HMFZ[210][10]中,   数组HMFZ[x][0]~   HMFZ[x][5]用于存放六个一组的数据,数组HMFZ[x][6]~   HMFZ[x][9]用于存放四个一组的数据....  
   
  很久没有用C了,程序也不会写了。...希望能有一可运行程序.. 问题点数:100、回复次数:16Top

1 楼lei001(太极)回复于 2006-12-31 19:52:02 得分 5

#include<iostream>  
  using   namespace   std;  
  int   a[210][10];  
  int   main()  
  {  
          int   i,j,k,l;  
  int   n=   0;  
  for(i=0;i<=9;i++)  
  for(j=i+1;j<=9;j++)  
  for(k=j+1;   k<=9;   k++)  
  for(l=k+1;l<=9;l++)  
  {  
        a[n][0]   =   i;  
        a[n][1]   =   j;  
        a[n][2]   =   k;  
        a[n][3]   =   l;  
        n++;  
  }  
                           
   
  }  
   
  这个程序是找出前四个数,后六个数从10个数中除去前面已经找到的四个数即可  
  Top

2 楼lei001(太极)回复于 2006-12-31 20:32:50 得分 10

#include<iostream>  
  using   namespace   std;  
  int   HMFZ[210][10];  
  int   main()  
  {  
          int   i,j,k,l;  
  int   n=   0;  
  /*找出前四个数字*/  
  for(i=0;i<=9;i++)  
  for(j=i+1;j<=9;j++)  
  for(k=j+1;   k<=9;   k++)  
  for(l=k+1;l<=9;l++)  
  {  
        HMFZ[n][0]   =   i;  
        HMFZ[n][1]   =   j;  
        HMFZ[n][2]   =   k;  
        HMFZ[n][3]   =   l;        
   
        n++;  
  }  
  /*找出后六个数字*/  
          for(i=0;i<n;)  
    {  
    j   =   4;    
              for(k=0;   k   <=   9   ;   )  
                      {  
              if((HMFZ[i][0]   !=   k)   &&   (HMFZ[i][1]   !=   k)   &&   (HMFZ[i][2]   !=   k)   &&   (HMFZ[i][3]   !=   k))  
      {  
    HMFZ[i][j]   =   k;  
      j++;  
      }  
      k++;      
        }    
      printf("%d:   %d   %d   %d   %d   %d   %d   %d   %d   %d   %d\n",i+1,HMFZ[i][0],HMFZ[i][1],HMFZ[i][2],HMFZ[i][3],HMFZ[i][4],HMFZ[i][5],HMFZ[i][6],HMFZ[i][7],HMFZ[i][8],HMFZ[i][9]);  
      i++;  
  }  
         
  }  
  Top

3 楼Kenmark(fenix)回复于 2006-12-31 20:33:40 得分 0

……Top

4 楼lorenzo13()回复于 2006-12-31 21:18:34 得分 0

2楼的,这儿是C语言,不是C++。。。。Top

5 楼doodoosun()回复于 2006-12-31 22:12:08 得分 0

能有一个简练一点的算法么..递归或者是效率更高的么?    
  Top

6 楼hxz001()回复于 2007-01-01 07:34:48 得分 0

效率更高的没有了  
  这道题本身就是纯穷举问题,没有窍门可循  
  递归倒不是不可以考虑  
  只是返回值要用指针了吧Top

7 楼xmxoxo(xmxoxo)回复于 2007-01-01 10:51:37 得分 0

不就是全排列加组合判断吗  
  递归就是生成全排,判断一下重复组合就是了Top

8 楼fosjos(无聊的菜鸟程序员)回复于 2007-01-01 11:00:33 得分 0

楼主之前不是已经问过,也有人回答了,  
   
  还有什么问题吗?Top

9 楼DonaldKnuth(克努特)回复于 2007-01-01 11:13:28 得分 20

//既然不用c++,给你一个完全c语言的实现,递归方法  
    //效率还可以,   负责存储每个组合的6个数,   其他4个数  
    //剔出就可以了,留给楼主自己来完成  
  #include   <stdio.h>  
  #define   N   100    
   
  int   a[N];  
  int   b[210][10];  
   
  void   com(int   n,   int   r)  
  {  
  static   int   count   =   0;  
  int   i   =   0;  
  int   j   =   0;  
   
  for   (i   =   n;   i   >=   r   ;   i--)  
  {  
  a[r]   =   i;  
  if   (r   ==   1) {  
   
  for   (j   =   1;   a[j]   >   0   ;   j++   )  
  b[count][j-1]   =   a[j]   -   1;  
  count++;    
  continue;  
  }  
  else  
                            com(i-1,r-1);        
  }  
  }  
   
  int   main(int   argc,   char   *argv[])  
  {      
          int   i,   j;  
  for(i   =   0;   i   <10;   ++i)  
  a[i]   =   0;  
  com(10,6);  
   
  for(i   =   0;   i   <   210;   ++i){  
  for(j   =   0;   j   <   6;   ++j)  
  printf("%d   ",   b[i][j]);  
  printf("\n");  
  }  
   
  getchar();  
  return   0;  
  }Top

10 楼akirya(坏[其实偶不是什么所谓的坏人])回复于 2007-01-01 12:28:20 得分 5

把2楼的  
  #include<iostream>  
  using   namespace   std;  
  换成#include<stdio.h>  
  就是C语言了。Top

11 楼DarknessTM(我的缘分在哪里?)回复于 2007-01-01 14:55:41 得分 0

#include   <stdio.h>  
  #include   <stdlib.h>  
   
  const   int   aa[10]   =   {0,1,2,3,4,5,6,7,8,9};  
  int   HMFZ[210][10];  
   
  int   put_numbers(const   int   *a,const   int   x,   int   *p,int   *q);  
  int   main(int   argc,   char   *argv[])  
  {  
   
   
  int   i,j;  
   
  for(i   =   0,j   =   0;i   <=   960   ;i++)  
  {  
  if(put_numbers(aa,i,&HMFZ[j][0],&HMFZ[j][6])   ==   4)   j++;  
  }  
   
  for(i   =   0;i   <   j;i++)  
  {  
  printf("%d   %d   %d   %d   %d   %d   |   %d   %d   %d   %d   |   %d\n",  
  HMFZ[i][0],HMFZ[i][1],HMFZ[i][2],HMFZ[i][3],HMFZ[i][4],HMFZ[i][5],  
  HMFZ[i][6],HMFZ[i][7],HMFZ[i][8],HMFZ[i][9],i);  
  }  
   
  system("PAUSE");  
  return   0;  
  }  
  int   put_numbers(/*in*/const   int   *a,/*in*/const   int   x,/*out*/   int   *p,/*out*/int   *q)  
  {  
  int   i;  
  int   nCount   =   0;  
  for(i   =   0;i   <   10;i++)  
  {  
  if(x   &   (1   <<   i))  
  {  
  *q   =   a[i];  
  q++;  
  nCount++;  
  }  
  else  
  {  
  *p   =   a[i];  
  p++;  
  }  
  }  
  return   nCount;  
  }Top

12 楼DarknessTM(我的缘分在哪里?)回复于 2007-01-01 14:59:50 得分 60

#include   <stdio.h>  
  #include   <stdlib.h>  
   
  const   int   aa[10]   =   {0,1,2,3,4,5,6,7,8,9};  
  int   HMFZ[210][10];  
   
  int   put_numbers(const   int   *a,const   int   x,   int   *p,int   *q);  
  int   main(int   argc,   char   *argv[])  
  {  
          int   i,j;  
          //   利用2进制数的各个位来进行穷举  
          //   该位是0的时候添加至前6个容器中  
          //   是1的时候添加到后面4个容器中  
          //   可以得到1的数目是4的时候符合LZ要求  
          for(i   =   0,j   =   0;i   <=   960   ;i++)  
          {  
                  if(put_numbers(aa,i,&HMFZ[j][0],&HMFZ[j][6])   ==   4)   j++;  
          }  
   
          for(i   =   0;i   <   j;i++)  
          {  
                  printf("%d   %d   %d   %d   %d   %d   |   %d   %d   %d   %d   |   %d\n",  
                          HMFZ[i][0],HMFZ[i][1],HMFZ[i][2],HMFZ[i][3],HMFZ[i][4],HMFZ[i][5],  
                          HMFZ[i][6],HMFZ[i][7],HMFZ[i][8],HMFZ[i][9],i);  
          }  
   
          system("PAUSE");          
          return   0;  
  }  
  int   put_numbers(/*in*/const   int   *a,/*in*/const   int   x,/*out*/   int   *p,/*out*/int   *q)  
  {  
          int   i;  
          int   nCount   =   0;  
          for(i   =   0;i   <   10;i++)  
          {  
                  //   位判断  
                  if(x   &   (1   <<   i))  
                  {  
                          *q   =   a[i];  
                          q++;  
                          nCount++;  
                  }  
                  else  
                  {  
                          *p   =   a[i];  
                          p++;  
                  }  
          }  
          return   nCount;  
  }Top

13 楼ReverseEngineering(★给我一杯壮阳水☆换我一夜不下垂★男人阳萎不是罪☆)回复于 2007-01-03 14:42:35 得分 0

学习一下。Top

14 楼Tse_nie123()回复于 2007-01-03 17:20:19 得分 0

学习一哈`  
  Top

15 楼zjq520()回复于 2007-01-03 18:34:51 得分 0

请问那一位能指教小弟一下C语言怎么学学啊Top

16 楼msccao()回复于 2007-01-04 00:16:24 得分 0

markTop

相关问题

关键词

得分解答快速导航

  • 帖主:doodoosun
  • lei001
  • lei001
  • DonaldKnuth
  • akirya
  • DarknessTM

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo