渡鸦


私信TA

用户名:dotcpp0810493

访问量:41

签 名:

等  级
排  名 29145
经  验 522
参赛次数 0
文章发表 2
年  龄 0
在职情况 学生
学  校 河北工程大学
专  业

  自我简介:

对于该题,通过排列组合的方法简单易懂

注意:

  1. 对于n个数的全排列的最多种类即为n!(n的阶乘)

  2. 因为给出的数据有重复的字母,而重复的字母会对全排列的种类有影响

思路:

      以本题所给数据为例:

输入四个字母,最多次数为4!=4*3*2*1=24;

输入aacc,a重复两次,c重复两次,所以在总数的基础上除以两个2!=1*2;

即24/2/2=6,即为最终的答案。

#include<iostream>
#include<string>
using namespace std;
int main() {
    int n,sum=1;
    cin >> n;
    for (int i = 1; i <= n; i++)//对输入的所有数据进行全排列
    {
        sum *= i;
    }
    string ch;
    cin >> ch;
    for (int i = 0; i < n; i++)
    {
        int x = 1,y=1;
        if (ch[i] != 0)
        {
            for (int j = i + 1; j < n; j++)
            {
                if (ch[i] == ch[j])
                {
                    x++;//统计重复次数
                    ch[j] = 0;//设立标志位,防止后续相同的字母再次计算
                }
            }
            for (int i = 1; i <= x; i++)
            {
                y *= i;//求出重复次数的阶乘
            }
            sum = sum / y;//除去重复的阶乘
        }
    }
    cout << sum;
    return 0;
}


 

0.0分

1 人评分

  评论区

  • «
  • »