题目描述
有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;
}