蓝桥杯周练 摸鱼小张的最大乘积问题

蓝桥杯周练 摸鱼小张的最大乘积问题

题目描述:

  • 一个正整数一般可以分为几个互不相同的自然数的和,如 3=1+2,4=1+3,5=1+ 4= 2 + 3,6=1+5=2+4。
  • 现在你的任务是将指定的正整数 n 分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。
  • 输入格式: 输入一个正整数 m (3 <= m <= 1000000)
  • 输出格式: 第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。(末尾数后无空格)
  • 第二行是最大的乘积。
  • 输入样例: 在这里给出一组输入。例如:
10
  • 输出样例: 在这里给出相应的输出。例如:
2 3 5
30

以下是本题的主要思路:
大家都清楚这题的意思,我们尽可能的把n分成更多份(都大于1)那样乘积最大。 (这里讲一下如果分出来的数可以重复,那么有时候并不是分出的份数越多越大,比如6,分成2,2,2不如分成3,3。但是不能重复的话就不存在这样的情况,大家可以想一下。) 以“6”为例,我们可以想到,我们先分出来一个2,然后再分出一个3…但是这样面临一个问题:“最后有余数怎么办”,比如“8”;分出来2,3还剩下3,没法再分出4,这时候怎么办呢?有的同学会想我把余数3都加到3身上,我们就分成了2和6,但是这样是最大的吗?(3和5才是最大的) 这时候我补充一下有一篇题解中所说:

“把余数分到大的数上比分到小的数上得到的乘积更大”。
实际不太准确,我们很容易证明出来如果能把数分到更小的数上,那么乘积更大(大家可以想想)。但是为什么最终是分到了大的数呢?就好比把6分成2,4,按照我们刚才的分法,先分出来了2和3最后余1,理论上我们把1给2得到的结果更大,但是我们不允许数重复,所以我们需要先把1给3,这样如果还剩下余数的话就分给2,所以当小的数被分配某个数后不会造成数的重复,那么优先给小的数分配,所以就像其他题解所说:

“从大数开始向前,依次分配1”。
所以对于8我们先分配出了2,3又余3,我们先分配1给3,得到2,4这时候2可以被分配,那么我们就分配给2一个1,得到3和4,这时候还余1,我们就分配给4,得到3,5。

代码:

package test;

/**
 * @author zhazhalin
 * @version 1.0
 * @date 2021/4/1 12:05
 */

import java.sql.Statement;
import java.util.Scanner;

/**
 * 一个正整数一般可以分为几个互不相同的自然数的和,如 3=1+2,4=1+3,5=1+ 4= 2 + 3,6=1+5=2+4。
 * 现在你的任务是将指定的正整数 n 分解成若干个互不相同的自然数的和,且使这些自然数的乘积最大。
 * 输入格式:
 * 输入一个正整数 m (3 <= m <= 1000000)
 * 输出格式:
 * 第一行是分解方案,相邻的数之间用一个空格分开,并且按由小到大的顺序。(末尾数后无空格)
 * 第二行是最大的乘积。
 * 输入样例:
 * 在这里给出一组输入。例如:
 * 10
 * 输出样例:
 * 在这里给出相应的输出。例如:
 * 2 3 5
 * 30
 */
public class 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值