2006年,这个C算法题目,相信在这里能有答案!100分...
有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




