当前位置: 首页 > news >正文

求第N个排列数

设序列为N个M位数的基本数字组成的排列数(N<=M)

假设序列是有序的,求第n个排列数(以0开始索引,0<=n<N!)

 

ContractedBlock.gif ExpandedBlockStart.gif GetNofP
void GetNofP(char const * const in,char* out,int const size,unsigned long long N)
//in必须为递增的序列,size为in的大小
//out为结果序列,out的大小必须大于size
//0<=N<size!

{
strcpy(out,in);
vector<unsigned long long > info(size);
int pos = size -1;
info[pos] = 1;
int i =1;
--pos;
while(pos>=0)
{
info[pos] = info[pos+1]*i;
++i;
--pos;
}
for(int i = 0;N!=0&&i<size;++i)
{
unsigned long cur =(unsigned long) (N/info[i]);
if(cur==0)
continue;
int newPos = i+cur;
int curVal =out[i];
out[i] = out[newPos];
--newPos;
while(newPos>i)
{
out[newPos+1]=out[newPos];
--newPos;
}
out[i+1] = curVal;
N = N%info[i];
}
}

测试代码

ContractedBlock.gif ExpandedBlockStart.gif 测试代码
int main(int argc, char* argv[])
{
char arr[] = "1234";
char out[sizeof(arr)];
unsigned long long sum =0;
int size =sizeof(arr)/sizeof(arr[0]) -1;
sum=1;
for(int i=1;i<=size;++i)
{
sum*=i;
}
int beg = GetTickCount();
for(unsigned long long i=0;i<sum;++i)
{
GetNofP(arr,out,size,i);
cout<<out<<endl;
}
int end = GetTickCount();
cout<<(end - beg)<<endl;
cout<<sum<<endl;

return 0;
}
ContractedBlock.gif ExpandedBlockStart.gif 输出结果
1234
1243
1324
1342
1423
1432
2134
2143
2314
2341
2413
2431
3124
3142
3214
3241
3412
3421
4123
4132
4213
4231
4312
4321
0
24
请按任意键继续. . .




转载于:https://www.cnblogs.com/SammyLan/archive/2011/10/13/2210520.html

相关文章:

  • 《Clojure数据分析秘笈》——2.8节大数据集的延迟处理
  • emacs学习中
  • 中国有望成超级计算机全球第一强国
  • Push的方式
  • 《Core Data应用开发实践指南》一2.6 单精度浮点数与双精度浮点数
  • ajax跨域原理
  • 红利窗口关闭?AI能否在安防开枝散叶
  • EntityFramework之领域驱动设计实践(六)(转)
  • Linux菜鸟级重点
  • LUN Mapping和ZONE在存储网络中的应用
  • Intel发布P4501数据中心超薄固态盘 3200MB/s、二代3D TLC
  • 深入分析 Java I/O 的工作机制
  • 微软延长Skylake平台支持Windows 7/8.1生命周期
  • vi 命令合集
  • 让小城市享受大城市的便利
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Linux各目录及每个目录的详细介绍
  • Logstash 参考指南(目录)
  • PHP面试之三:MySQL数据库
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 工作手记之html2canvas使用概述
  • 后端_ThinkPHP5
  • 精彩代码 vue.js
  • 目录与文件属性:编写ls
  • 在Docker Swarm上部署Apache Storm:第1部分
  • ​​​​​​​ubuntu16.04 fastreid训练过程
  • #微信小程序(布局、渲染层基础知识)
  • (1)(1.13) SiK无线电高级配置(五)
  • (2)Java 简介
  • (27)4.8 习题课
  • (solr系列:一)使用tomcat部署solr服务
  • (三) diretfbrc详解
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转) 深度模型优化性能 调参
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)linux下的时间函数使用
  • (转)德国人的记事本
  • ***检测工具之RKHunter AIDE
  • ./configure、make、make install 命令
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net/c# memcached 获取所有缓存键(keys)
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • [ 转载 ] SharePoint 资料
  • [145] 二叉树的后序遍历 js
  • [C#] 我的log4net使用手册
  • [CareerCup] 13.1 Print Last K Lines 打印最后K行
  • [CQOI 2010]扑克牌
  • [Docker]十二.Docker consul集群搭建、微服务部署,Consul集群+Swarm集群部署微服务实战
  • [Invalid postback or callback argument]昨晚调试程序时出现的问题,MARK一下
  • [IT生活推荐]大家一起来玩游戏喽,来的都进!