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);
}
}