母函数练习(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;
}  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值