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語言結構體之間怎麼組合
學生結構體下面再加個借書編號的數組,這樣就關聯起來了,但是要保證編號唯一