1. 求一道c语言的编程,正整数,所有可能的组合形式
#include<stdio.h>
#include<string.h>
typedef struct aa
{
int data;
int Parent;
int Offset; //偏移量,,
}AA;
AA a[1000000];
int N,i,front,rear,cnt=0,cnt1,x,dt[1000000],off[1000000];
char ss[100],p[100];
void Chg()
{
a[rear].data = a[front].data -i;
a[rear].Parent=front; a[rear].Offset = i;
if(x ==1)
{
if(i> a[front].Offset && front>0) //*****区别于有序数据....
{cnt++;rear++; }
if(front==0) {cnt++;rear++; }
}
else {cnt++;rear++; }
}
int main()
{
front =0; rear=1;
printf("输入数字:
");scanf("%d",&N); x=0;
a[0].data=N; a[0].Offset = 1; //注意这里是1;不是0;
cnt=0;
printf("所有的加法情况如下:
");
while(front!=rear)
{
//for(i=a[front].Offset;i<=a[front].data/2;i++) ////*****区别于有序数据....
for(i=a[front].Offset;i<=(a[front].data-x)/2;i++)
Chg();
front++;
}
int tmpi,tmpx,kk=0;
for(i=0;i<rear;i++)
{
tmpi= i; dt[kk]=a[tmpi].data;
while(tmpi != 0)
{
kk++;dt[kk]=a[tmpi].Offset;
tmpi =a[tmpi].Parent;
}
for(kk;kk>=1;kk--)
printf("%d+",dt[kk]);
printf("%d
",dt[kk]);
}
printf("共计次数%d
",cnt+1);
return 0;
}
2. 超难的c语言组合问题
回溯吧,反正只有n<10
/*
Name:
Copyright:
Author:
Date: 06-12-08 12:34
Description:
输入括号的对数n (1<n<10),输出所有的合法组合形式
例:n=3,输出:()()(),(()()),()(()),(())(),
*/
#include<iostream>
using namespace std;
void Print(int n);
int main(int argc, char* argv[])
{
int n;
cin >> n;
Print(n);
system("pause");
return 0;
}
void Print(int n)
{
if (n == 0)
cout << " ";
else
{
for (int i=1; i<=n; i++)
{
for (int j=0; j<i; j++)//输出i对括号
cout << '(';
for (int j=0; j<i; j++)
cout << ')';
Print(n-i); //输出剩余的括号
}
}
}
第二题是要求输出所有组合,还是只要输出组合个数?
3. 求C语言组合函数
这题目有点意思,本人这两天研究了一下,针对char类型写了一个小程序,测试成功。大概思路是这样的:要做Cmn的组合,可以用一个有n个元素的指针数组,数组中的元素分别指向给定集合中的n个元素,每次取出这些指针所指的值,再按照一定的规律移动指针,如此循环直至结束。下面附上函数源代码及注释,希望对你有所帮助,至于char以外的其它集合,你也不妨试着写写。
void fun(char *strSrc,char *strDes,int n) //strSrc是源数组,strDes是目标数组,n为要选取的个数
{
int i,j,k,len,flag;
char **pp;
char *pSrc,*pDes;
flag=0;
len=strlen(strSrc);
if(n>len)
return;
pSrc=strSrc;
pDes=strDes;
pp=new char*[n];
for(i=0;i<n;i++) //初始时n个指针分别指向前n个数据
pp[i]=pSrc++;
while(1)
{
for(i=0;i<n;i++) //取当前组合数据赋给目标字符串
*pDes++=*pp[i];
*pDes++=' '; //为了看上去方便而加的分隔符
if(flag==1) //若完成则退出
{
*pDes='\0';
break;
}
if( *(pp[n-1]+1)!='\0' ) //若一组中最后一个指针还没有指向源字符串中最后一个数据
pp[n-1]++;
else
{
for(j=n-1;j>0;j--) //从后往前寻找应该移动的指针
{
if(pp[j-1]+1!=pp[j]) //找到指针pp[j-1]
{
//如果该指针为第一个,并且与第二个只隔一个位置,说明下一组为最后一组
if((j-1==0)&&(pp[j-1]+2==pp[j]))
{
pp[j-1]++;
flag = 1;
}
else //否则将找到的指针及其后面的所有指针移动到新位置
{
pp[j-1]++;
for(k=j;k<n;k++)
pp[k] = pp[k-1]+1;
}
break;
}
}
}
}
for(i=0;i<n;i++)
pp[i]=NULL;
delete []pp;
}
4. 在C语言中,如何输出一组数的排列组合
#include <stdio.h>
#include <stdlib.h>
int n = 0;
void swap(int *a, int *b)
{
int m;
m = *a;
*a = *b;
*b = m;
}
void perm(int list[], int k, int m)
{
int i;
if(k > m)
{
for(i = 0; i <= m; i++)
printf("%d ", list[i]);
printf(" ");
n++;
}
else
{
for(i = k; i <= m; i++)
{
swap(&list[k], &list[i]);
perm(list, k + 1, m);
swap(&list[k], &list[i]);
}
}
}
int main()
{
int k;//输入自然数的个数
printf("请输入连续自然数的个数:");
scanf("%d",&k);
int *list = (int *)malloc(k);
for (int i = 0; i < k; i ++)
{
list[i] = i + 1;
}
// int list[] = {1, 2, 3, 4, 5};
perm(list, 0, k-1);
printf("total:%d
", n);
return 0;
}
该程序的输入为一个任意自然数n,将输出从1到n的全排列。
(4)c语言危险的组合扩展阅读:
C语言的基本数的排列法
1、冒泡排序:每次相邻两个数比较,若升序,则将大的数放到后面,一次循环过后,就会将最大的数放在最后。
#include <stdio.h>
int main(void)
{
int a[1001];
int n,i,j,t;
scanf("%d",&n);//n为要排序的数的个数
//输入要排序的数
for(i=0;i<n;++i)
scanf("%d",a+i);
//接下来进行排序
for(i=0;i<n-1;++i)//n个数,总共需要进行n-1次
{ //n-1个数排完,第一个数一定已经归位
//每次会将最大(升序)或最小(降序)放到最后面
for(j=0;j<n-i-1;++j)
{
if(a[j]>a[j+1])//每次冒泡,进行交换
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
for(j=0;j<n;++j)
printf("%-5d ",a[j]);
printf(" ");
}
return 0;
}
2、选择排序:从第一个数开始,每次和后面剩余的数进行比较,若升序,则如果后边的数比当前数字小,进行交换,和后面的所有的数比较、交换后,就会将当前的最小值放在当前的位置。
#include <stdio.h>
int main(void)
{
int a[1001];
int n,i,j,t;
scanf("%d",&n);//n为要排序的数的个数
//输入需要排序的数
for(i=0;i<n;++i)
scanf("%d",a+i);
//接下来进行排序
for(i=0;i<n-1;++i)//因为每次需要和a[i]后面的数进行比较,所以到a[n-2](倒数第2个元素)就行
{
for(j=i+1;j<n;++j)//j从i后一个开始,a[i]与a[j]进行比较
{
if(a[i]>a[j])//a[i]为当前值,若是比后面的a[j]大,进行交换
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}//每排序一次,就会将a[i](包括a[i])之后的最小值放在a[i]的位置
for(j=0;j<n;++j)
printf("%-5d",a[j]);
printf(" ");
}
return 0;
}
5. c语言危险的组合,请问这表达式是怎么来的
这实际上是数学问题,而不是C语言问题
1. n个盒子排成一行,如果把第一个盒子拿掉,剩下的n-1个盒子里面满足条件,有cnt(n-1)种,第一个盒子无所谓是什么盒子,因此上面的这种情况 2*cnt(n-1) 种。
2. n个盒子排成一行,如果把第一个盒子拿掉,剩下的n-1个盒子不满足条件,那么只有当前三个盒子是铀,第四个盒子是铅才可以。(注:第四个盒子如果是铀,那么234盒子就满足条件了)。
pow(2, n-4)是n-4盒子的所有情况,减去cnt(n-4)后n-4盒子满足条件的(因为本部分讨论的是“如果把第一个盒子拿掉,剩下的n-1个盒子不满足条件”)。得到第二种情况的数目是pow(2,n-4)-cnt(n-4)
然后加到一起就可以了
6. c语言编程排列组合
void Show(int n,int len ,char str[], char p[],int *i){/*函数功能说明:
密码穷举法 递归算法参数说明:len 密码可选元素的个数,实际等于 strlen(str);
n 密码位数。
STR[]密码表。
*p 密码排列组合的临时存档*/int a;n--;for(a=0; a < len; a++){p[n]=str[a];
if(n==0)printf("%d:%s ",(*i)++,p);
if(n0)Show(n,len , str,p,i);}}
/*驱动程序 用于测试*/
int main(void){char str[]="abcdef";//密码表 可选元素集合可根据选择修改
int n=4;//密码位数,根据具体应用而定。
int len=strlen(str);//用于密码元素集合计数。
char p[20];//存放排列组合的密码,用于输出。
int num=0;//存放统计个数的整数值,
int *i=#//计数器 地址。
p[n]='\0';//这个不用说啦。
printf("\n%d 位密码,每个密码有%d个选择的话,共有:%d个组合。\n",n,len,*i);return 0;}
以上回答你满意么?
7. C语言 排列组合
发个C#的代码:
int[] a = { 1 , 2 , 3 , 4 , 5 , 6 };
int weishu = 6;
int weishu2 = weishu - 1;
int zuida = (int)Math.Pow( 2 , weishu2 );
List<int[]> list = new List<int[]>();
for ( int i = 0 ; i < zuida ; i++ )
{
int[] b = (int[])a.Clone();
for ( int j = 0 ; j < weishu2 ; j++ )
{
int c = i >> j;
if ( (c & 1) == 1 )
{
int tmp = b[ j ];
b[ j ] = b[ j + 1 ];
b[ j + 1 ] = tmp;
}
}
list.Add( b );
}
System.Text.StringBuilder sb = new System.Text.StringBuilder();
sb.AppendLine( string.Format( "共 {0} 个结果" , list.Count ) );
foreach ( int[] aa in list )
{
for ( int i = 0 ; i < aa.Length ; i++ )
{
sb.Append( aa[ i ] );
if ( (i & 1) == 1 )
sb.Append( '\t' );
}
sb.AppendLine();
}
Console.WriteLine( sb.ToString() );
运行结果:
共 32 个结果
12 34 56
21 34 56
13 24 56
23 14 56
12 43 56
21 43 56
13 42 56
23 41 56
12 35 46
21 35 46
13 25 46
23 15 46
12 45 36
21 45 36
13 45 26
23 45 16
12 34 65
21 34 65
13 24 65
23 14 65
12 43 65
21 43 65
13 42 65
23 41 65
12 35 64
21 35 64
13 25 64
23 15 64
12 45 63
21 45 63
13 45 62
23 45 61
8. c++危险的组合 求大神解释一下这代码的思路是什么
排列组合,首先把三个铀绑定在一起,看做一个物体,有(n-2)种方法,剩下的(n-3)个地方每个有两种方法,所以ans=(n-2)*2^(n-3)
9. C语言整数组合
代码如下:
#include<stdio.h>
#include<stdlib.h>
intmain()
{
shortx,y,z;
printf("请输入xy的值:");
scanf("%d%d",&x,&y);
z=(x&0xff00)|((y>>8)&0x00ff);
printf("z=%d ",z);
system("pause");
return0;
}
运行结果:
10. C语言结构体之间怎么组合
学生结构体下面再加个借书编号的数组,这样就关联起来了,但是要保证编号唯一