C语言 · 排列数

算法提高 排列数

时间限制:1.0s   内存限制:256.0MB

问题描述

  0、1、2三个数字的全排列有六种,按照字母序排列如下:
  012、021、102、120、201、210
  输入一个数n
  求0~9十个数的全排列中的第n个(第1个为0123456789)。

输入格式

  一行,包含一个整数n

输出格式

  一行,包含一组10个数字的全排列

样例输入

1

样例输出

0123456789

数据规模和约定

  0 < n <= 10!

 1 #include<stdio.h>
 2 #include<string.h>
 3 long long n,sum;
 4 int label[10];//用来标记数字i是否被用了,即是否已被放在了排列中
 5 int a[10];
 6 void SouSuo(int pos){
 7     if(pos==10){  //表示当前数组a中已有10个数字
 8         sum++;
 9         if(sum==n){
10             for(int i=0; i<10; i++)
11                 printf("%d",a[i]);
12         }
13     }
14     for(int i=0; i<=9; i++){//枚举数字0到数字9
15         if(!label[i]){//若数字i还没被放在当前排列中
16             a[pos]=i;//将i赋给当前排列a数组的第pos位置
17             label[i]=1;//数字i已放入排列中,标记为1
18             SouSuo(pos+1);//继续搜索下一个位置
19             label[i]=0;//清除标记
20         }
21     }
22 }
23 int main(){
24     scanf("%d",&n);
25     if(n==0){
26         return 0;
27     }
28     memset(label,0,sizeof(label));//给标记赋初值0
29     sum=0;
30     SouSuo(0);
31     return 0;
32 }  
时间: 2024-12-11 06:21:43

C语言 · 排列数的相关文章

C语言 &#183; 排列数 &#183; 排列式

蓝桥练习场上不断碰到类似的题,都是一个递归搜索的套路. 算法提高 排列数 时间限制:1.0s   内存限制:256.0MB 问题描述 0.1.2三个数字的全排列有六种,按照字母序排列如下: 012.021.102.120.201.210 输入一个数n 求0~9十个数的全排列中的第n个(第1个为0123456789). 输入格式 一行,包含一个整数n 输出格式 一行,包含一组10个数字的全排列 样例输入 1 样例输出 0123456789 数据规模和约定 0 < n <= 10! 作者注释:标准

SCU 4424(求子集排列数)

A - A Time Limit:0MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice SCU 4424 Description Time Limit: 1000ms Description Given N distinct elements, how many permutations we can get from all the possible subset of the eleme

第k个排列数

变长编码,这里排列的序号是0到n!-1,假设求 1,2,3,4 的第15个排列数,15/(3!) = 2, 余数是3,第一个数是(1,2,3,4)中的第二个数 3 (这里0是开始位置),3/(2!) = 1, 余数是1,第二个数就是(1,2,4)中的第一个数 2,  1/(1!) = 1, 余数是0,第三个数(1,4)中的第1个数就是4, 最后一个数就是1.结果就是3,2,4,1 #include <cstdio>#include <cstring>#include <vec

如何直观地理解排列数和组合数

如果要问我高中时学文科有什么不好,我觉得,最不好的一点就是在你上概率论课时,你听着老师讲的内容一脸蒙蔽,而其他同学纷纷表示自己高中时就已经学过了.之前做题遇到排列数与组合数都是直接写A和C,并不进行计算,所以对于其公式也只是记住能用就好,但是今天闲着无聊,想试着推导一下排列数和组合数的公式,也为了能深入理解排列数和组合数的原理,所以就开始了天马行空的想象. 对于排列数,可以视为“分步解决”的问题,也就是说: 第一步,从n个某物中选取1个,有n种选择方法: 第二步,从剩下的n-1个某物中选取1个,

46. Permutations 排列数

46. Permutations 题目 Given a collection of distinct numbers, return all possible permutations. For example, [1,2,3] have the following permutations: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1] ] 解析 class Solution_46 { public: void help(int

李洪强-C语言5-函数

C语言函数 一.函数 C语言程序是由函数构成的,每个函数负责完成一部分的功能,函数将工恩呢该封装起来,以供程序调用. 二.函数定义 目的:将一些常用的功能封装起来,以供日后调用. 步骤:确定函数名,确定函数体,调用 格式:返回值类型 函数名(形式参数列表) {  函数体 } 三.函数调用 定义函数需要明确定的东西: ①. 取一个有意义的函数名 ②. 确定函数的形参 ③. 编写函数体 ④. 返回值 示例: Int average(int num1,int num2) { Return  (num1

递归基础—组合数 / 排列数—输出的各种办法(dfs/递归/bfs)

B: 部分和问题***(注意部分和 ! = 任意子区间求和不一样) 描述   给你N个数,问你能不能从其中取出一些,让它们的和为K. 输入 第一行包括两个数,N,K,分别代表数字个数,以及和为K. 接下来N行,每行一个数字. 输出 如果能选出一些数和为K, 输出YE5,  否则,输出N0 样例 输入: 4 0 1 -1  2  3 输出: YE5 输入: 2 2 1 -3 输出: N0 本题求组合数和,注意pe之外,思维比较基础,办法很多,以下为利用dfs思想实现的一种办法 如果求组合数输出各种

排列数

1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 using namespace std; 5 long long sum=0; 6 void print_permutation(int n,int s,int *a,int cur);//n为输出的,s为元素个数,a为数组,cur当前位置. 7 int main() 8 { 9 int s[11]; 10 int n; 11 scanf(&quo

c语言推断数是否是素数

这是推断数是否是素数.网络版非常.我觉得有点问题.今天一个朋友问我这个问题.我知道,今天,我把自己的代码,非常实用哦!. #include<stdio.h> #include<math.h> int Prime(unsigned int a) { unsigned int i; int k=0; if (a==1) k=1; else for(i=2;i<sqrt(a);i++) if(a%i==0) { k=1; break; } return k; } int main(