hdu 1133 Buy the Ticket(递推+精度精算)

做这道题之前可以先做:hdu 1267(递推方法和这道题是一样的知识没有精度计算)这是我的博客链接接:http://www.cnblogs.com/jiangjing/archive/2013/01/18/2866168.html

题意:就是去买票,票价是50元一张,卖票的没有零钱找的,然后买票的只有50元和100元的,题意给出m个人拿了50元n个人拿了100元问总共有多少种买票顺序(不同的人也算)

在hdu 1267里我已经讲了递推方法,我在这里就不纠结了,只要乘以m!n!就可以了

代码实现:

#include<stdio.h>
#include<string.h>
int a[101][101][101]={0};
int b[101][101]={0}; //b数组里面保存的是a数组里面的元素个数
void qiuhe(int x0,int y0,int x1,int y1,int n)//大数相加这种方法可以先学习下,否则看起来比较吃力
{
    int i,j,k=0;
    j=b[x0][y0];
    if(j<b[x1][y1])
        j=b[x1][y1];
    for(i=0;i<j;i++)
    {
       a[x0][y0][i]+=a[x1][y1][i]*n+k;
       k=a[x0][y0][i]/10000;//每个元素四位
       a[x0][y0][i]%=10000;
    }
    if(k)
    {
        a[x0][y0][j]=k;
        b[x0][y0]=j+1;
    }
    else
        b[x0][y0]=j;
}
void jiecheng(int n)//求大数阶乘
{
   int i,j,k=0;
   for(i=0;i<b[n-1][0];i++)
   {
       a[n][0][i]=1;
       a[n][0][i]=a[n-1][0][i]*n+k;
       k=a[n][0][i]/10000;
       a[n][0][i]=a[n][0][i]%10000;
   }
   if(k)
   {
       a[n][0][i]=k;
       b[n][0]=i+1;
   }
   else
       b[n][0]=b[n-1][0];
}
int main()
{
    int T=0,i,j,m,n;
    a[1][0][0]=1;b[1][0]=1;
    for(i=2;i<=100;i++)
        jiecheng(i);//当m=0时的排列数
    for(i=1;i<=100;i++)
        for(j=i;j<=100;j++)
        {
            qiuhe(j,i,j-1,i,j);
            qiuhe(j,i,j,i-1,i);
        }
   while(scanf("%d%d",&m,&n)!=EOF&&(m||n))
    {
      T++;
      printf("Test #%d:\n",T);
      printf("%d",a[m][n][b[m][n]-1]);
      for(i=b[m][n]-2;i>=0;i--)
          printf("%4.4d",a[m][n][i]);
      printf("\n");
    }
    return 0;
}

 

posted on 2013-01-18 12:17  后端bug开发工程师  阅读(1594)  评论(0编辑  收藏  举报

导航