欧拉计划 题目24 (全排列)

本文介绍了一种求解特定字典序排列的方法,并通过C++实现,找到了0到9的数字进行第100万次字典序排列的具体结果。

题目描述:

排列是一个物体的有序安排。例如3124是1,2,3,4的一种排列。如果所有的排列按照数值或者字母序排序,我们称其为一个字典序。0,1,2的字典排列有:

012   021   102   120   201   210

0, 1, 2, 3, 4, 5, 6, 7, 8,9的第100万个字典排列是什么?

 

本来并不知道怎么求出序列的全排列。看了一下一位大神的博客,居然有这么多的方法。我就用了最简单易懂的字典序法。

http://blog.youkuaiyun.com/visame/article/details/2455396

 

View Code
 1 #include<iostream>   
 2 #include<string.h>   
 3 using namespace std;   
 4        
 5 char st[15] = "0123456789";   
 6 int main()   
 7 {   
 8     int i , j , k , l , len , temp1;   
 9     char min , temp2;   
10     len  = strlen(st);   
11     for(i = 1; i < 1000000; i++)   
12     {   
13         min = 58;   
14         for(j = len-2; j >=0; j--)   
15         {   
16             if(st[j] <st[j+1])   
17             {   
18                 for(k = j+1; k < len; k++)   
19                 {   
20                     if(st[k] > st[j])    //找出比st[j]大的数中最小的一个   
21                     {   
22                         if(min > st[k])   
23                         {   
24                             min = st[k];   
25                             temp1 = k;   
26                         }   
27                     }   
28                 }   
29                 temp2 = st[j];              //交换   
30                 st[j] = st[temp1];   
31                 st[temp1] = temp2;   
32                 for(k = j+1 , l = len-1; k <= l; k++ , l--)    //倒转   
33                 {   
34                     temp2 = st[k];   
35                     st[k] = st[l];   
36                     st[l] = temp2;   
37                 }   
38                 break;   
39             }   
40         }   
41     }   
42     cout<<st<<endl;   
43     return 0;   
44 }

 

转载于:https://www.cnblogs.com/nigel-jw/archive/2013/05/06/3063355.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值