1. c語言:求n個數的全排列
難道數據自動生成? 就申請了空間
頭文件記得加入#include <stdlib.h>
2. 在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的全排列。
(2)c語言求1到n的排列擴展閱讀:
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;
}
3. c語言,遞歸1~n按字典順序全排列
#includevoidswap(char&a,char&b,charc){c=a;a=b;b=c;}voidperm(char*list,inti,intn){intj,temp;if(i==n){for(j=0;j<=n;j++)printf("%c",list[j]);printf("");}else{for(j=i;j<=n;j++){swap(list[i],list[j],temp);perm(list,i+1,n);swap(list[i],list[j],temp);}}}voidmain(){charlist[3]={'A','B','C'};perm(list,0,2);}
4. c語言,如何得到n個數所有的排列
#include
<stdio.h>
inline
void
Swap(char&
a,
char&
b)
{//
交換a和b
char
temp
=
a;
a
=
b;
b
=
temp;
}
void
Perm(char
list[],
int
k,
int
m)
{
//生成list
[k:m
]的所有排列方式
int
i;
if
(k
==
m)
{//輸出一個排列方式
for
(i
=
0;
i
<=
m;
i++)
putchar(list[i]);
putchar('\n');
}
else
//
list[k:m
]有多個排列方式
//
遞歸地產生這些排列方式
for
(i=k;
i
<=
m;
i++)
{
Swap
(list[k],
list[i]);
Perm
(list,
k+1,
m);
Swap
(list
[k],
list
[i]);
}
}
int
main()
{
char
s[]="123";
Perm(s,
0,
2);
return
0;
5. 用C語言編程求1、2、3到n的全排列
#include <stdio.h>
int main()
{
int n, nn;
printf("input a number: ");
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
{
nn = 1;
for (int j = 1; j <= i; ++j)
{
nn = nn * j;
}
printf("%d! = %d\n", --j, nn);
}
return 0;
}
6. 用C語言寫一個函數:可以生成K個從1—N的隨機排列。其中K和N都是參數。
/*偶然看到,覺得有趣,試著寫了個,不知道能不能達到樓主要求?*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void getrand(int n)
{
int i=0,m=0,t,*a;
a=(int*)malloc(sizeof(int)*n);
a[m++]=rand()%n+1;
while(m<n)
{ t=rand()%n+1;
while(1)
{
for(i=0;i<m;i++)
if(a[i]==t)
break;
if(i<m)
t=rand()%n+1;
else {
a[m++]=t;
break;
}
}
}
while(m--)
printf("%d ",a[m]);
printf("\n");
}
int main()
{ int i,k,n;
scanf("%d%d",&k,&n);
for(i=0;i<k;i++)
srand(rand()),getrand(n);
return 0;
}
7. C語言列問題 從鍵盤輸入一個整數n,請輸入1,2,……,n的所有排列
#include <stdio.h>
void perm(int* data, int n, int curr)
{
if (curr==n-1)
{
for (int i = 0; i < n; ++i)
printf("%d", data[i]);
printf("\n");
}
else
{
for (int i = curr; i < n; ++i)
{
int t;
t = data[curr], data[curr] = data[i], data[i] = t;
perm(data, n, curr+1);
t = data[curr], data[curr] = data[i], data[i] = t;
}
}
}
int main()
{
int array[128] = {0};
int n = 0, i = 0;
scanf("%d", &n);/*沒有數據合法性檢查*/
for (i = 0; i < n; ++i) array[i] = i+1;
perm(array, n, 0);
return 0;
}
4
1234
1243
1324
1342
1432
1423
2134
2143
2314
2341
2431
2413
3214
3241
3124
3142
3412
3421
4231
4213
4321
4312
4132
4123
Press any key to continue
8. 在c語言編程中如何將1-10的數從小到大排列。
冒泡法!在我們寫程序的時候,通常都會對一組數據進行排序,常用的方法有冒泡法和選擇法,我主要寫下我對冒泡法的理解和心得。
冒泡法:顧名思義,就是把小的數據向前排,也就是向上浮起,並因此進行排序。
例:
#include "stdio.h" 包含頭文件
void main() 主函數
{
int a[10],t,i,j; 定義要用的數據和數祖
printf("input the ten number:\n"); 顯示輸出
for(i=0;i<10;i++)
scanf("%d",&a[i]); 利用循環接受數據
for(j=0;j<10;j++)
for(i=0;i<9-j;i++)
if(a[i]>a[i+1])
{
t=a[i];
a[i]=a[i+1]; 這個就是冒泡的要義了,這個語句是進行冒泡的,下面會有解釋
a[i+1]=t;
}
for(i=0;i<10;i++)
printf("%d\t",a[i]); 循環輸出排序後的數據
}
9. 求用c++/c語言編寫一個輸入n輸出1~n的所有排列(千萬不是排列數哦)的...
#include<iostream>
#include<algorithm>
usingnamespacestd;
intmain()
{
intn;
cout<<"Inputn"<<endl;
//輸入n
cin>>n;
//這里可以自己做輸入錯誤檢測
//給數組動態分配大小
int*a=newint[n];
//給數組賦值(要排列的數據源)
for(inti=1;i<=n;i++)
{
a[i-1]=i;
}
do{
//依次輸出每個數
for(inti=0;i<n;i++)
{
cout<<a[i]<<"";
}
//換行
cout<<endl;
}
//做排列計算(C++stl函數)
while(next_permutation(a,a+n));
//記得釋放
delete[]a;
return0;
}
運行結果如下:
10. 用C語言 編寫程序輸入一個整數,輸出從1到這個整數的所有排列組合。 樣例一: 輸入:3
#include<stdio.h>
ints[1000];
voidf(inta[],intlen,intn)
{
if(!n)
{
for(inti=0;i<len-1;i++)
{
printf("%d",s[i]);
}
printf("%d ",s[len-1]);
}
for(inti=0;i<len;i++)
{
if(a[i]!=0)
{
s[len-n]=a[i];
a[i]=0;
f(a,len,n-1);
a[i]=i+1;
}
}
}
intmain()
{
intn;
inta[1000];
while(~scanf("%d",&n))
{
for(inti=0;i<n;i++)a[i]=i+1;
f(a,n,n);
}
}