hdu 1261 排列組合&&大數(shù)除法
來源:程序員人生 發(fā)布時間:2015-08-26 08:18:43 閱讀次數(shù):4088次
唉 不知道第1次發(fā)甚么神經(jīng) 第1次把t定義成char 型的了
小數(shù)還對 大數(shù)就不多了、、、找了半個小時才找到 以后要仔細了
求大數(shù) 1定是用字符串保存,,long long 肯定溢出。
具體思路就是把所有字符個數(shù)加起來的階乘n!除以各個字符出現(xiàn)的個數(shù)的階乘。
#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++)//計算各個字符的個數(shù)階乘
sum=sum*j;
a[i]=sum;
count+=x;//求字符總個數(shù)。
}
for(i=2;i<=count;i++)//大數(shù)階乘。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--)//大數(shù)除以小數(shù),字符串摹擬除法進程。大膽的除吧 肯定能整除。
{
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;
}
生活不易,碼農辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈