帮小弟看看这个程序,到底出错在哪
程序题目为:Description
有n个字母,列出由该字母组成的字符串的全排列(相同的排列只计一次)。
Input
第一行输入是字母个数n,1<=n<=20。接下来一行输入的是待排列的n个字母。
Output
计算出的n 个字母的所有不同排列总数
Sample Input
4
aacc
Sample Output
6
我的编程思路采取排列组合的方法,即如果有n个字母,有m个是相同的,则总排列总数肯定为n的阶乘除以m的阶乘,还要注意小弟下面的程序是用c++软件运行的,运行结果是对的,但在网站上提交的时候却错了,所以想请各位看看问题在哪
我编的程序为:
#include<iostream>
using namespace std;
int f(int n) //函数f的功能是求n 的阶乘,因为如果有n个不同字母进行排列组合,肯定有n阶乘种方法,
{int z=1,i;
for (i=1;i<=n;i++)
z=z*i;
return z;}
int main()
{char a[20];
int i,j,k,x=1,b,m,n=0;
cin>>b;m=f(b); // 输入变量b,并求出其阶乘
for (i=0;i<b;i++)// 输入b个字母
cin>>a[i];
for (i=1;i<b;i++)//看b个字母当中,总共有几个与第一个字母相同,用x做计数器,然后用排列组合方法,除去与第一个字母相同的排列组合,并将x赋原
if (a[0]==a[i])x++;m=m/f(x);x=1;
for (i=1;i<b-1;i++)//采用上面的方法,将第二个字符到第b-2个字母依次进行检查,看其后面有几个字母与被检查的字母相同,但是....
{for (k=0;k<i;k++) // 但是这里要考虑,考虑被检查的字母跟前面所有的字母是否相同,如果相同,再除以这个字母的阶乘,显然就重复了,所以..
if (a[i]!=a[k])n++; // 所以考虑不相同的,
if (n==i) // 如果n等于i,则证明a[i]与前面的字母全不相同,所以就可以用排列组合方法
{for (j=i+1;j<b;j++)
if (a[i]==a[j] ){x++;m=m/f(x);x=1;}}}
cout<<m;}