用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 分,我全部家当了。
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 <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组(每组九个数字)有多少种分法,并显示分组的主要内容,如果未能解决你的问题,请参考以下文章