1207: 字符排列问题

题目描述
有n个字母,列出由该字母组成的字符串的全排列(相同的排列只计一次)。

输入
第一行输入是字母个数n,1<=n<=20。接下来一行输入的是待排列的n个字母。

输出
计算出的n 个字母的所有不同排列总数

样例输入
4
aacc

样例输出
6

既然是全排列就自然会想到用阶乘,用总的阶乘数除以相同字母的阶乘数就好了,上代码。

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n;
    char s[22]={0};
    while(~scanf("%d %s",&n,s))
    {
        sort(s,s+n);
        long long ans = 1,b = 1,c = 1;//最好是 long long 了避免运算过程中类型溢出

        for(int i = 1;i <= n;i++)
            ans*=i;

        for(int i = 1;i < n;i++)
        {
            if(s[i]==s[i-1])
                b++;
            else
            {
                for(int j = 1;j <= b;j++)
                        c*=j;//相同的字母

                ans/=c;
                b=1;
                c=1;
            }
        }

        ans/=b;
        printf("%lld\n",ans);
    }
    return 0;
}
    原文作者: 汉诺塔问题
    原文地址: https://blog.csdn.net/drfcgjnkml/article/details/81488253
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞