3030: 分解的积

题目描述

给你一个正整数 n ,找到一组拆法,即 a1+a2+...+ak=n ,k 任意,使得 a1∗a2∗...∗ak 最大,求这个最大值

输入

一个正整数 n(n∈[1,50])

输出

输出最大乘积

样例输入 Copy

8

样例输出 Copy

18

提示

8=2+3+3

2∗3∗3=18

积为 18 是最大的拆法

这道题好像有很多做法,可以用动态规划什么的,不过我不会(目前只会语法),还有贪心,下面这个代码应该是贪心吧。

/贪心,这个题肯定是3越多越好,因为3后的每一个数都能拆成3
#include <stdio.h>
int max(int n)
{  if(n<=3) return n;//n小于3的时候,直接返回n就行
  int num=1;  //赋予num为1,用于后面计算
  while(n>4)//这个循环条件要大于4(1+3,1*3=3<4),比如5(2+3,2*3=6)
   {   num*=3; //如果是4的话直接乘就好了
        n-=3; //n每次减3
   }
    num*=n; //n经过操作小于4后,剩下的不用再拆了,直接乘进去就好
  return num;
}
int main()
{ int n;
 scanf("%d",&n);    
printf("%d",max(n));
    return 0;
}
//举个例子:4,进去直接不循环,直接1*4=4
//5,进去5-3=2,2小于4,ok,循环了一次,num*3=3,退出循环后num再乘下后面的剩余的数

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值