康托展开和康托逆展开

#include<bits/stdc++.h>
using namespace std;
int f[20];
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    f[0]=1;
    for(int i=1;i<=10;++i)
    f[i]=i*f[i-1];
    string str;
    cin>>str;//54321
    int l=str.size();
    int ans=1;//康托展开编号从0开始
    for(int i=0;i<l;++i)
    {
        int cnt=0;
        for(int j=i+1;j<l;++j)
        if(str[j]<str[i]) cnt++;
        ans+=cnt*f[l-i-1];
    }
    cout<<ans<<'\n';//120
    int ord=120;
    ord--;
    for(int i=1;i<=5;++i)
    {
        int t=ord/f[l-i];//找到第t+1大的数
        cout<<t+1;//54321
        ord%=f[l-i];
    }
    return 0;
}

 

原文链接: https://www.cnblogs.com/ruoye123456/p/17068763.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    康托展开和康托逆展开

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/314270

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月16日 下午1:15
下一篇 2023年2月16日 下午1:15

相关推荐