C语言:从11个数中随机选3个组合在一起。

从11选3
一共是165个组合,
我敲165下任意键,逐个显示。
希望语言高手们鼎力相助....

写个 C 控制台的,
它能够完成 从任意个数中随机选择任意个组合,并且按一下键盘,
将这个组合显示出来。

为什么会这样,这和你的说法不一致,因为你说的部分内容不好界定,
就是"我敲165下任意键,逐个显示。"这一句。

可以修改这个程序的输出部分,达到你的需要。

//加吧,getch,rand都在哪里呢?
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>

//这两个宏,允许修改成任意个数,比如从12个数里选4个...

//定义数11个
#define MAX_DIGIT 11
//定义选3个,要求 SEL_DIGIT < MAX_DIGIT
#define SEL_DIGIT 3

void your_programing()
{

//定义数组
int digit[MAX_DIGIT];
int select[SEL_DIGIT];

int i,j;
char key;
bool flag;

//向地球人打声招呼,一切就要开始了
printf("\nhello,world\n");

//初始化数组,或者按环境要求初始化
//这里假定允许有重复数,无序
//不想重复,就多一道处理
for (i = 0; i < MAX_DIGIT; i++)
{
//用随机数初始化
digit[i] = ((rand() << 16) | rand());
}

//弄个简单死循环,要求输入字符'q' 或 'Q'退出
while (1)
{
printf("\nPlease press any key,if q or Q then quit.\n");
key = getch();
if (key == 'q' || key == 'Q')
{
//没办法,人家选择退出了,还不快退,要待何时?
break;
}

//闲话休说,进入主题

//要随机选3个数组合,就要将选中数存入select数组
for (i = 0; i < SEL_DIGIT; i++)
{
//用随机数来做任意数量的选择,但要处理重复结果
do
{
flag = false;

//产生不越界的数组下标
select[i] = rand() % MAX_DIGIT;
//检查下标是否重复
for (j = 0; j < i; j++)
{
if (select[i] == select[j])
{
//出现重复下标,赶紧重新选择
flag = true;
break;
}
}
}while (flag);

//非常愉快,找到了可用的下标
}
//非常愉快,获得了可心的随机数

//打印出这个随机的组合
printf("\nThe %d Selected is ",SEL_DIGIT);
for (i = 0; i < SEL_DIGIT; i++)
{
//很有趣,因为我们利用了模算术做下标的特点
//所以,这里只需访问数组下标即可,而且考虑了越界
printf("%d",digit[select[i]]);

//打印个分隔符吧,看着也舒服
if (i != 0 && i != SEL_DIGIT - 1)
{
printf(",");
}
}
}

//程序要结束了,说点什么吧
printf("\nThe End.\n");

}

///小注:
前文提到rand()的随机性问题,的确如此,它的白噪声一般应用尚可,
看你的应用环境了,严格的可选择专业的白噪声发生器。

//
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-02-23
void test()
{
int a[12] = {0,0,1,2,3,4,5,6,7,8,9,10}, i;
i = 1+(int)(11.0*rand()/(RAND_MAX+1.0)); //产生1~11的随机数
cout<<a[i]<<"~";
i = 1+(int)(11.0*rand()/(RAND_MAX+1.0));
cout<<a[i]<<"~";
i = 1+(int)(11.0*rand()/(RAND_MAX+1.0));
cout<<a[i]<<"\n";
}
在main函数中调用test函数就可以了
有一点需要说明:
因为rand的内部实现是用线性同余法做的,他不是真的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,rand()会返回一随机数值,范围在0至RAND_MAX 间。rand ()产生的是假随机数字,每次执行时是相同的。
第2个回答  2010-02-23
大意就是循环一下,你可以参考一下思路自己写。我已经3年没写C了,有很多错误

#include "stdafx.h"
#include"stdio.h"
#include <string>

using namespace System;

int main()
{
printf("press any key to continue");
int a[] = {1,2,3,4,5,6,7,8,9,10,11};//自己定义
string s;
for(int i=0;i<11;i++){
s=a[i];
for(int m=0;m<11;m++){
if(m == i){
m++;
}else{
s+=","+a[m];
}
for(int n=0;n<11;n++){
if(n == m || n == i){
n++;
}else{
s+=","+a[n];
}
}
}
}
return 0;
}
第3个回答  2010-02-23
同学你好!
自己做了个,运行成功,可以满足你的要求的。

#include<stdio.h>
#include<stdlib.h>

#define N 11

void Creat(int p[]);/*数组赋值*/
void Arrange(int p[]);/*排列组合*/

void main()
{
int p[N];
Creat(p);
Arrange(p);
}

void Creat(int p[])
{
int i;
for(i=0;i<N;i++)
{
printf("Please input the %dth data:",i+1);
scanf("%d",&p[i]);
}
}

void Arrange(int p[])
{
int i,j,k,number=0;
for(i=0;i<N;i++)
for(j=i+1;j<N;j++)
for(k=j+1;k<N;k++)
{
printf("The %dth Arrange:",++number);
printf("%d %d %d",p[i],p[j],p[k]);
system("PAUSE");
}
}

希望我的回答对你有帮助,祝你的成绩进步~本回答被提问者采纳
相似回答