zoukankan      html  css  js  c++  java
  • 求第N个排列数

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

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

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

    测试代码

    测试代码
    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;
    }
    输出结果
    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
    请按任意键继续. . .




  • 相关阅读:
    12.Scala- 注解
    11.Scala-特质
    10.Scala-继承
    9.Scala- 包和引入
    8.Scala-对象
    7.Scala-类
    6.Scala-高阶函数
    5.Scala-匹配模式
    4.Scala-数据结构
    Ruby on Rails Tutorial 第四章 Rails背后的Ruby 之 类
  • 原文地址:https://www.cnblogs.com/SammyLan/p/2210520.html
Copyright © 2011-2022 走看看