hdu 1261 排列组合大数除法

唉 不知道第一次发什么神经 第一次把t定义成char 型的了

小数还对 大数就不多了、、、找了半个小时才找到 以后要细心了

求大数 一定是用字符串保存,,,long long 肯定溢出。

具体思路就是把所有字符个数加起来的阶乘n!除以各个字符出现的个数的阶乘。

#include <stdio.h>#include <string.h>#define num 1000int 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-1;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-1;i>=0;i–)if(str[i]!=0)break;for(q=i;q>=0;q–)printf("%d",str[q]);printf("\n");}return 0;}

莫找借口失败,只找理由成功。(不为失败找理由,要为成功找方法

hdu 1261 排列组合大数除法

相关文章:

你感兴趣的文章:

标签云: