唉 不知道第1次发甚么神经 第1次把t定义成char 型的了
小数还对 大数就不多了、、、找了半个小时才找到 以后要仔细了
求大数 1定是用字符串保存,,long long 肯定溢出。
具体思路就是把所有字符个数加起来的阶乘n!除以各个字符出现的个数的阶乘。
#include <stdio.h>
#include <string.h>
#define num 1000
int main()
{
char str[num];
long long n,x,count,j,i,q,sum,a[30],t,k;
while(scanf("%lld",&n)!=EOF&&n)
{
memset(str,0,sizeof(str));
str[0]=1;
count=0;
for(i=0;i<n;i++)
{
scanf("%lld",&x);
sum=1;
for(j=2;j<=x;j++)//计算各个字符的个数阶乘
sum=sum*j;
a[i]=sum;
count+=x;//求字符总个数。
}
for(i=2;i<=count;i++)//大数阶乘。count
{
for(q=0,t=0;q<num;q++)
{
k=str[q]*i+t;
str[q]=k%10;
t=k/10;
}
}
for(i=num⑴;i>=0;i--)
if(str[i]!=0)
break;
for(q=0;q<n;q++)
{
sum=0;
for(j=i;j>=0;j--)//大数除以小数,字符串摹拟除法进程。大胆的除吧 肯定能整除。
{
t=(sum*10+str[j])/a[q];
sum=(sum*10+str[j])%a[q];
str[j]=t;
}
}
for(i=num⑴;i>=0;i--)
if(str[i]!=0)
break;
for(q=i;q>=0;q--)
printf("%d",str[q]);
printf("
");
}
return 0;
}