题意:给出一个数n,将其拆分为若干个互不相等的数字的和,要求这些数字的乘积最大。

分析:我们可以发现任何一个数字,只要能拆分成两个大于1的数字之和,那么这两个数字的乘积一定大于等于原数。也就是说,对于连乘式中,如果将一个乘数a更换为两个数字b×c(a=b+c且b>1,c>1),那么乘积只可能增大或不变,不会减小。所以我们拆分的原则就是将这些数字拆得尽量小,拆成许多2的乘积是最好的。又因为题目约束各个数字不能相同,则我们拆分的结果最理想的情况是从2开始的公差为1的等差数列。但是有时是无法构成这样的等差数列的,因为构成到某一位时会出现构建下一位不够用的情况,例如,n=6时,6=2+3+1。当我们要构成4的时候只剩下1了。如果余数是1,那么我们必然要加到前面的某一个数字上,否则乘积无法增大。如果是大于1的数,也必须加在前面的某些数字上,否则如果单乘会出现重复数字。对于一个余数,应该每次将余数中的一个1分配给数列中最小的数字,这样才能使得乘积每次增大的幅度最大,因为增加量是所有除了最小乘数之外的数字的乘积。但是这样做会造成数字重复,所以唯一可以避免数字重复的方法是将这些1从最大的数字开始依次向较小数分配,让每个乘数增加1。但是这样仍然可能有剩余,但最多剩余1,因为再多就足够构成下一个乘数的了,同样为了避免重复,我们只能将这个1加在最大的乘数上。

import java.util.ArrayList;

import java.util.Scanner;

public class Test {

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner sc = new Scanner(System.in);

int n=sc.nextInt();

int result=1;

int remain=n;

int a=2;

ArrayList arr=new ArrayList();

while(remain>=a){

arr.add(a);

remain=remain-a;

a++;

}

for(int i=arr.size()-1;remain>0;i--,remain--){

arr.set(i, arr.get(i)+1);

if(i==0){

i=arr.size();

}

}

for(int j=0;j

result*=arr.get(j);

}

System.out.println(result);

}

}

n分解后的最大乘积java_【编程题】乘积最大的拆分相关推荐

  1. PAT-然后是几点(简单编程题)

    有时候人们用四位数字表示一个时间,比如1106表示11点零6分.现在,你的程序要根据起始时间和流逝的时间计算出终止时间. 读入两个数字,第一个数字以这样的四位数字表示当前时间,第二个数字表示分钟数,计 ...

  2. c语言程序题是如何判分的,C语言编程题判分系统的研究与实现

    摘要: 随着计算机技术和因特网的发展,B/S模式的教学系统在高校教学中显得越来越重要.C语言程序设计是计算机专业的一门重要的基础课程,具有实践性强的特点,在教学中应加大实践教学比例.本文利用网络技术开 ...

  3. (附Matlab程序)(二)基于DCT编码的图像压缩:对分解后的每个数据小方块进行DCT及IDCT变换

    问题一:随机选取一幅图像x.jpg,先将图像分解为8x8个数据块,然后分别对分解后的每个数据小方块进行DCT及IDCT变换,分别保留左上角3.10.15.32个系数进行处理,并对结果进行对比分析. c ...

  4. 小米校招编程题:数组乘积、异形数、朋友圈

    这里记录一下方便查找,原文地址:http://blog.csdn.net/hackbuteer1/article/details/8484974 二.编程题 1.数组乘积(15分) 输入:一个长度为n ...

  5. “类EMD”算法分解后要怎样使用(1)——内涵模态分量IMF的方差贡献率、平均周期、相关系数的计算及MATLAB代码实现

    之前我们有了十几篇文章讲述了EMD算法的基础理论.IMF的含义.EMD的MATLAB实现方法,EEMD.CEEMD.CEEMDAN.VMD.ICEEMDAN.LMD.EWT的理论及代码实现,还讲到了H ...

  6. 贪心 最大乘积 java_最大乘积|贪心算法|FOJ1698|TYVJ3024

    最大乘积 [问题描述] 一个正整数一般可以分为几个互不相同的自然数的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,-.现在你的任务是将指定的正整数n分解成若干个互不相同的自然数 ...

  7. 给定两个数r和n_输出r的n次方 java_滴滴出行2018编程题

    [编程题] CIDR去重 时间限制:1秒 空间限制:65536K 无类别域间路由(CIDR)是一个用于对IPV4地址进行分类表述的方法.CIDR 路由描述的IP地址组的子网mask长度是可变长度, 例 ...

  8. matlab怎么求imf图,MATLAB中提取EMD分解后的每个IMF图像,并导出每个IMF数据

    题目: MATLAB中提取EMD分解后的每个IMF图像,并导出每个IMF数据 EMD分解程序我就不给了,网上都是一样的. 例: M = length(imf); N = length(x); c = ...

  9. PTA-然后是几点(基础编程题)

    PTA-然后是几点(基础编程题) 有时候人们用四位数字表示一个时间,比如1106表示11点零6分.现在,你的程序要根据起始时间和流逝的时间计算出终止时间. 读入两个数字,第一个数字以这样的四位数字表示 ...

  10. 魔法币 java_网易2018校招笔试编程题-魔法币 java实现

    魔法币 原题 小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币. 魔法机器1:如果投 ...

最新文章

  1. 微信小程序自定义组件之Picker组件
  2. linux的上传工具,Linux下精简版上传工具lrzsz
  3. Qt最新版5.12在Windows环境静态编译安装和部署的完整过程(VS2017)
  4. IP、TCP、UDP报文头说明
  5. MFC listctrl显示缩略图时索引问题和滚动条问题
  6. Singleton单例模式
  7. HDFS集群balance(3)-- 架构细节
  8. 在SMARTFORMS中取消使用WORD作为编辑器
  9. (3.2)将分词和去停用词后的评论文本基于“环境、卫生、价格、服务”分类...
  10. kinux mysql报错10038_navicat连接linux系统中mysql-错误:10038
  11. LINUX 下设置系统时间 DATE 命令
  12. 研究发现视频会议增加员工压力、 谷歌地球升级4D交互体验、Apple新品发布、网飞用户增长缓慢等|Decode the Week
  13. php内存映射,如何用ZwMapViewOfSection将Driver分配的内存映射到App空间?
  14. 牛客网知识点总结(二
  15. STM32F103ZET6 蜂鸣器、按键
  16. 图论 —— 图的连通性 —— 传递闭包
  17. npm安装iViewUI框架 - cmd篇
  18. Websocket教程SpringBoot+Maven整合(详情)
  19. java 读取excel wps_安装WPS引发的excel上传问题
  20. 3.5框架不能创建就加这一段代码

热门文章

  1. firebase登录验证_如何使用Firebase通过三步向身份验证本机添加身份验证
  2. erlang有前途吗_带有示例的Erlang概述
  3. linux 下外语学习软件_学习外语如何帮助您学习编码
  4. Flink 有状态计算的状态容错
  5. 求矩阵特征值的方法和性质
  6. jQuery 插件autocomplete 应用
  7. Asp.net Ajax,Jquery,ExtJs 三种Ajax技术框架比较
  8. Page.ClientScript.RegisterStartupScript() 方法与Page.ClientScript.RegisterClientScriptBlock() 方法
  9. vue复选框默认被选中_vue .js绑定checkbox并获取、改变选中状态的实例
  10. OpenCV中的「透视变换 / 投影变换 / 单应性」—cv.warpPerspective、cv.findHomography