用C语言写:36个数字平均分成4组(每组九个数字)有多少种分法,并显示分组

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C语言写:36个数字平均分成4组(每组九个数字)有多少种分法,并显示分组相关的知识,希望对你有一定的参考价值。

只要求数字不一样,位置不做要求(本人只有25分,只能给20分,见谅)
那若是12个数字平均分成4组(每组3个数字)能算得出结果么?代码怎样写
哥们你辛苦了,程序运行成功,但从程序运行结果看,可能我的表达有问题,导致你理解错了我的意思,我的意思是:分组出来后的4组数字,与上一次分组的4组数字均不相同,如 [1,2,3][4,5,6][7,8,9][10,11,12];
[1,4,10][2,5,9][3,5,8][7,11,12];每一个对应的分组均不相同,劳烦大侠再指教,不胜感激,您辛苦了,追加20 分,我全部家当了。

参考技术A 唉,刚才想到的那个算法有问题,算了,给你一个用穷举写的吧:
36个数字平均分成4组的分法太多了,有2万多种,得运行好长时间
#include <conio.h>
#include <stdio.h>

#define N 36
#define M 9

int main()

int num[N]=0;
int i1,i2,i3,i4,i5,i6,i7,i8,i9,count=0;

for(i1=0;i1<N;i1++) num[i1]=i1+1;

for(i1=0;i1<(N/M);i1++)
for(i2=0;i2<(N/M);i2++)
for(i3=0;i3<(N/M);i3++)
for(i4=0;i4<(N/M);i4++)
for(i5=0;i5<(N/M);i5++)
for(i6=0;i6<(N/M);i6++)
for(i7=0;i7<(N/M);i7++)
for(i8=0;i8<(N/M);i8++)
for(i9=0;i9<(N/M);i9++)

printf("%2d %2d %2d %2d %2d %2d %2d %2d %2d\n",num[i1],num[4+i2],num[8+i3],num[12+i4],num[16+i5],num[20+i6],num[24+i7],num[28+i8],num[32+i9]);
count++;

if(count%(N/M)==0)printf("\n");


printf("%d ",count);

getch();
return 0;
本回答被提问者采纳
参考技术B 这是相异物组合,总共有这麼多次取法:
C36取9 * C27取9 * C18取9 * C9取9
~= 2.145275... * 10^19
以目前 4G Hz 的 CPU , 假设一个 clock 就能解决一笔 (实际上少说也要十几个clock) ;
所耗费的时间将为 (2 * 10^19) / (4 * 10^9) 秒
~= 158.6 年

所以只提供 6个数字平均分成2组分法, 如果你真的不计代价要去跑 158.6 年以上的程式,就照著改吧 !

以下为12个数字平均分成4组;
次数为 C12取3 * C9取3 * C6取3 * C3取3
= 369600 次 ; 电脑可以很快跑完

http://eprob.math.nsysu.edu.tw/PerComb/repComb/index.html

这样可以归类为相异物组合箱子相同的情况;建议加个资料结构存已成功的组合
组数存放大小要个 369600 / 4! = 15400 (基本上也只剩15400种)
struct box
int a1 , a2 , a3 ;
int b1 , b2 , b3 ;
int c1 , c2 , c3 ;
int d1 , d2 , d3 ;
;
struct box* use_box ;
int size_i ;
use_box = (struct box*)malloc( 15400 * sizeof(struct box) );
在输出的地方加搜寻比对动作,
若没重复
>>>表示又一组新的组合,加入结构中用来被搜寻比对
若重复
>>>这笔就不算拉
参考技术C 唉,刚才想到的那个算法有问题,算了,给你一个用穷举写的吧:
36个数字平均分成4组的分法太多了,有2万多种,得运行好长时间
#include
<conio.h>
#include
<stdio.h>
#define
N
36
#define
M
9
int
main()

int
num[N]=0;
int
i1,i2,i3,i4,i5,i6,i7,i8,i9,count=0;
for(i1=0;i1<N;i1++)
num[i1]=i1+1;
for(i1=0;i1<(N/M);i1++)
for(i2=0;i2<(N/M);i2++)
for(i3=0;i3<(N/M);i3++)
for(i4=0;i4<(N/M);i4++)
for(i5=0;i5<(N/M);i5++)
for(i6=0;i6<(N/M);i6++)
for(i7=0;i7<(N/M);i7++)
for(i8=0;i8<(N/M);i8++)
for(i9=0;i9<(N/M);i9++)

printf("%2d
%2d
%2d
%2d
%2d
%2d
%2d
%2d
%2d\n",num[i1],num[4+i2],num[8+i3],num[12+i4],num[16+i5],num[20+i6],num[24+i7],num[28+i8],num[32+i9]);
count++;
if(count%(N/M)==0)printf("\n");

printf("%d
",count);
getch();
return
0;
参考技术D 简单高中数学题

1 :c36 9 * c27 9 * c18 9

2:c12 4 * c8 4

这个c语言(c++)的程序要怎么写?

内容:设计一个猜数字游戏,它能根据游戏规则猜数。
功能:产生原始数字:产生4个随机数,并按任意顺序排列。
游戏提示:用1A2B形式提示玩家当前猜数字的匹配情况。例如1A表示玩家猜测的数字有1个与系统产生的原始数字符合,并且位置也符合。2B表示玩家猜测的数字有2个与系统产生的原始数字符合,但位置不符合。
原始数字显示:当用户10次仍然不能猜出正确的原始数字和顺序时,系统提示玩家失败,并给玩家显示原始数字和顺序。
提示:可能涉及语法点:数组、选择与循环、函数

完全不明白要怎么出随机排序还要对号,如果有高人能编写出完整的可运行的程序,我会再追加分数!
当用户10次仍然不能猜出正确的原始数字和顺序时,系统提示玩家失败,并给玩家显示原始数字和顺序。
这点好像没有达到啊!不过强人,做到这里已经非常感谢了

我需要的程序代码是能直接复制在Microsoft visual c++6.0中即可运行出结果的

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

void RandomShuffle(int* a, int n)

int tmp, i, pick;

for(i = 0; i < n; ++i)

pick = rand() % n;
tmp = a[i];
a[i] = a[pick];
a[pick] = tmp;



void PrintSeq(int* beg, int* end)

while(beg != end)
printf("%d ", *beg++);
putchar('\n');


void ReadSeq(int* beg, int* end)

while(beg != end)
scanf("%d", beg++);


int Analyse(int* resBeg, int* resEnd, int* beg, int* end)

int fully_match = 0;
int numbers_match = 0;
int* p1, * p2;

for(p1 = beg; p1 != end; ++p1)
for(p2 = resBeg; p2 != resEnd; ++p2)

if(*p2 == *p1 && p2 - resBeg == p1 - beg)
++fully_match;
else if(*p2 == *p1)
++numbers_match;


if(fully_match != end - beg)
return printf("Clue: %dA%dB\n", fully_match, numbers_match), 0;
else
return 1;


void Guess(int* resBeg, int* resEnd, int allowedTimes)

int* myNumBeg = (int*)malloc(sizeof(int) * (resEnd - resBeg));
int* myNumEnd = myNumBeg + (resEnd - resBeg);

printf("NOTE: No Duplicates!\n");

do
printf("\nEnter %d numbers(You have %d more chance):\n", myNumEnd - myNumBeg, allowedTimes);
ReadSeq(myNumBeg, myNumEnd);
while(!Analyse(resBeg, resEnd, myNumBeg, myNumEnd) && --allowedTimes > 0);

if(allowedTimes != 0)
printf("\nYou got it!\n");
else
printf("\nGame Over!!\n");

printf("Origin seq is: ");
PrintSeq(resBeg, resEnd);

free(myNumBeg);


int main()

srand((unsigned)time(0));

int a[] = 0, 1, 2, 3, 4, 5, 6, 7, 8, 9;

RandomShuffle(a, 10); // 随机打乱
Guess(a, a + 4, 10); // 选4个数字作为答案,允许用户猜10次
return 0;


有失败提示和给出答案结果的过程啊,以下是(3次机会)我在vc6.0的测试:

NOTE: No Duplicates!

Enter 4 numbers(You have 3 more chance): // 第一次
1 2 3 4
Clue: 1A0B

Enter 4 numbers(You have 2 more chance): // 第二次
2 3 1 4
Clue: 0A1B

Enter 4 numbers(You have 1 more chance): // 第三次
1 2 4 3
Clue: 1A0B

Game Over!! // 没猜着,猜着的话是You got it!
Origin seq is: 0 2 9 7 // 答案(原始数组)
Press any key to continue
参考技术A 以下是主要代码
这个程序是个Win32窗口程序,如果要完整工程源代码请给我你的电子邮箱地址

我的:runtime_class@163.com

// GuessNum.cpp
//
//GuessNum App
//SigmaTera
//2007-08-14

#include "stdafx.h"
#include "resource.h"

#include <ctime>
#include <cstdlib>

void GenerateNum(LPTSTR lpDights,int nLength);
void CheckInputNum(LPCTSTR lpDigits,LPCTSTR lpGenDigits,LPTSTR lpResult,int nLenDigits,int nLenResult);
bool CheckInput(LPCTSTR lpDigits);

BOOL WINAPI DlgProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)

// TODO: Place code here.
DialogBoxParam(hInstance,MAKEINTRESOURCE(IDD_DIALOG_MAIN),NULL,DlgProc,0);
return 0;

BOOL WINAPI DlgProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)

static TCHAR szDigit[5];
static TCHAR szResult[5];
static TCHAR szInputDigits[5];
static TCHAR szTips[16];

static int nTimes = 10;

if (uMsg == WM_INITDIALOG)

EnableWindow(GetDlgItem(hWnd,IDOK),FALSE);
SetWindowText(GetDlgItem(hWnd,IDC_TIPS),"祝您成功!");

else if (uMsg == WM_CLOSE)

EndDialog(hWnd,0);

else if (uMsg == WM_COMMAND)

switch(LOWORD(wParam))

case IDGEN:
GenerateNum(szDigit,4);
EnableWindow(GetDlgItem(hWnd,IDOK),TRUE);
nTimes = 10;
break;
case IDOK:
GetWindowText(GetDlgItem(hWnd,IDC_EDIT_INP),szInputDigits,5);
if (lstrlen(szInputDigits) < 4 || CheckInput(szInputDigits) == false)

MessageBox(0,"输入非法","提示",MB_OK);
SetWindowText(GetDlgItem(hWnd,IDC_EDIT_INP),"");
break;


CheckInputNum(szDigit,szInputDigits,szResult,4,4);
SetWindowText(GetDlgItem(hWnd,IDC_SHOW_RESULT),szResult);
if (lstrcmp(szInputDigits,szDigit) == 0)

MessageBox(0,"恭喜您猜对了!","提示",0);
EnableWindow(GetDlgItem(hWnd,IDOK),FALSE);

nTimes--;
wsprintf(szTips,"您还有%d次机会",nTimes);
if (nTimes == 0)

SetWindowText(GetDlgItem(hWnd,IDC_TIPS),"失败了:(");
MessageBox(0,"抱歉,您在10次内没有答对","提示",0);
EnableWindow(GetDlgItem(hWnd,IDOK),FALSE);
break;

SetWindowText(GetDlgItem(hWnd,IDC_TIPS),szTips);
break;
case IDCANCEL:
EndDialog(hWnd,0);
break;


return FALSE;


void GenerateNum(LPTSTR lpDights,int nLength)

srand(time(0));
int i = 0;
int nGen = 0;
bool bGenerated = false;

while(i < nLength)

bGenerated = false;
nGen = rand() % 10 + 48;
for (int j = i;j >= 0;j--)

if (lpDights[j] == nGen)

bGenerated = true;
break;


if (bGenerated)

continue;

else

lpDights[i] = nGen;
i++;



void CheckInputNum(LPCTSTR lpDigits,LPCTSTR lpGenDigits,LPTSTR lpResult,int nLenDigits,int nLenResult)

int nPosID = 0;
int nSameLetterID = nLenDigits;
TCHAR szTemp[256];

for (int i = 0;i < nLenDigits;i++)

if (lpGenDigits[i] == lpDigits[i])

nPosID++;

for (int j = 0;j < nLenDigits;j++)

if (lpGenDigits[i] == lpDigits[j])

nSameLetterID--;



wsprintf(szTemp,"%dA%dB",nPosID,nSameLetterID);
lstrcpyn(lpResult,szTemp,nLenResult + 1);


bool CheckInput(LPCTSTR lpDigits)

bool bGenerated = false;
int i = 0;
while(lpDigits[i] != '\0')

bGenerated = false;
if (i == 0)

i++;
continue;


for (int j = i - 1;j >= 0;j--)

if (lpDigits[j] == lpDigits[i])

return false;
break;


i++;

return true;
参考技术B #include <iostream.h>
#include <time.h>
#include <stdlib.h>
void Checkout(char [],char [],int &,int &);
void Swap(char &a,char &b);
void main()

bool right=false;
char goon;
int times=0,perfect,nearly,init;
char guess[5],in[255],orig[10]='0','1','2','3','4','5','6','7','8','9';
srand((unsigned)time(NULL));
while (1)

for(int i=0;i<4;i++)

init=rand()%10;
Swap(orig[i],orig[init]);

for(i=0;i<4;i++)
guess[i]=orig[i];
guess[5]='\0';
right=false;
for(times=0;times<10 && !right;times++)

perfect=0;nearly=0;
cin>>in;
Checkout(guess,in,perfect,nearly);
cout<<perfect<<"A"<<nearly<<"B"<<endl;
if(perfect==4)
right=true;

if (right)
cout<<"You Get It!\n";
else

cout<<"Try Harder Next Time!\nThe number is ";
for (i=0;i<4;i++)
cout<<guess[i];
cout<<endl;

cout<<"Continue? y for yes,n for no ";
cin>>goon;
if(goon!='y' &&goon!='Y')
break;



void Checkout(char gn[4],char ck[4],int &p,int &n)

for (int i=0;i<4;i++)

if(ck[i]==gn[i])
p++;
else

for (int j=0;j<4;j++)

if(ck[i]==gn[j])
n++;





void Swap(char &a,char &b)

char temp;
temp=a;
a=b;
b=temp;
本回答被提问者采纳
参考技术C 简单,看完就知道怎么做了
提示下:
产生随机数有个专用函树的,而且你这个程序产生的随机数没有排序的必要吧
将随机数放到数组里,将用户输入的数放到另一个数组里
利用循环加判断就可以搞定了
就提示这么多了,剩下的都是些语法问题了
参考技术D 很简单嘛

以上是关于用C语言写:36个数字平均分成4组(每组九个数字)有多少种分法,并显示分组的主要内容,如果未能解决你的问题,请参考以下文章

怎么用excel做滑动平均

如何在100万个整数中 选出最大的10个 java

急!!!C语言:输出两组数组中相同的数字

C语言中,怎么从0~9中随机抽取4个不同的数字

36辆车和6个赛道,筛选出最快的3辆车

IP地址的四组数字分别代表啥啊