母函数练习(HDOJ习题)--QQ日志

1085.c
/*15Ms
用的是标记数组的办法,不是模拟数组乘法!!!
*/
#include<stdio.h>
#define MAX 10001    // 注意,一定要大于最大值 , max + 1
int a[MAX];
int main()
{
    int i, j, k, num_1, num_2, num_5;
    while (scanf("%d%d%d",&num_1,&num_2,&num_5)&&(num_5||num_2||num_1))
    {
     for (i=0; i<MAX; i++)   //初始化数组a
        {
             a[i] = 0;
        }
        for (j=0; j <= num_1; j++)//若有num_1的值为n,则一次可以取0,1,2,……,n个num_1,所以num_1有n+1中取法
        for (k=0; k+j <= num_1+2*num_2; k=k+2)//数组标记,处理2分的硬币
            a[k+j]++;
        for (j=0; j <= num_1+2*num_2&&a[j]; j++)
        for (k=0; k+j <= num_1+2*num_2+5*num_5; k+=5)//5分的硬币
            a[k+j]++;
     for (i=0; i <= 5*num_5+2*num_2+num_1+1; i++)
     {
      if (a[i]==0)
      {
        printf("%d\n",i);// a保存最终结果
     break;
      }
     }
    }
    return 0;
}
1085_1.c
//0Ms
#include<stdio.h>
int main()
{
 int num_1,num_2,num_5,res;
 while(scanf("%d%d%d",&num_1,&num_2,&num_5)&&(num_1||num_2||num_5))
 {
  res=5*num_5+2*num_2+num_1;
  if(num_1==0) res=0;
  if(num_2==0&&num_1<4) res=num_1;
  if(num_1==1&&num_2==1) res=3;
  printf("%d\n",res+1);
 }
 return 0;
}
/*用数组的值保存系数,数组下表保存指数,从而将多项式因式转换为数组存储到计算机中
*/
1028.c
#include<stdio.h>
#define MAX 121    // 注意,一定要大于最大值 , max + 1
int a[MAX], b[MAX];
int main()
{
    int i, j, k, n;
    for (i=0; i<MAX; i++)   // 给所有项赋初值 即存储第一个多项式
    {
        a[i] = 1;
        b[i] = 0;
    }
    for (i=2; i<MAX; i++)    // 乘以几个括号, 控制循环    即多项式乘法中因式的个数
    {
        for (j=0; j<MAX; j++)    // 当前状态下,第一括号里的各项(已有项)
        for (k=0; k+j<MAX; k+=i)    // 开始相乘,一般两个条件,一个k,一个k+j
        {
            b[j+k] += a[j];
        }
        for (j=0; j<MAX; j++)      //  乘过后的各项
        {
            a[j] = b[j];//数组a保存当前得到的结果,以便下次计算,每次都将数组a保存的多项式作为第一个因式去做乘法计算
            b[j] = 0;//b暂存中间结果,a与b的大小相同,为不影响下一次计算,用0覆盖数组b的中的所有值
        }
    }
    while (scanf("%d",&n) != EOF)
    {
          printf("%d\n",a[n]);//a保存每次计算后的最终结果,因此程序结束时a保存的即为最终结果
    }
    return 0;
}  

猜你喜欢

转载自blog.csdn.net/aa1bb1cc2/article/details/34173975