• 343. Integer Break


        /*
         * 343. Integer Break 
         * 2016-7-11 by Mingyang 
         * 正整数从1开始,但是1不能拆分成两个正整数之和,所以不能当输出。
         * 那么2只能拆成1+1,所以乘积也为1。
         * 数字3可以拆分成2+1或1+1+1,显然第一种拆分方法乘积大为2。
         * 数字4拆成2+2,乘积最大,为4。
         * 数字5拆成3+2,乘积最大,为6。
         * 数字6拆成3+3,乘积最大,为9。
         * 数字7拆为3+4,乘积最大,为12。
         * 数字8拆为3+3+2,乘积最大,为18。
         * 数字9拆为3+3+3,乘积最大,为27。
         * 数字10拆为3+3+4,乘积最大,为36。
         * ....
         * 
         * 那么通过观察上面的规律,我们可以看出从5开始,数字都需要先拆出所有的3,
         * 一直拆到剩下一个数为2或者4,因为剩4就不用再拆了,
         * 拆成两个2和不拆没有意义,而且4不能拆出一个3剩一个1,这样会比拆成2+2的乘积小。
         * 那么这样我们就可以写代码了,先预处理n为2和3的情况,
         * 然后先将结果res初始化为1,然后当n大于4开始循环,我们结果自乘3,n自减3,根据之前的分析,
         * 当跳出循环时,n只能是2或者4,
         * 再乘以res返回即可:
         */
         public int integerBreak(int n) {
                if (n == 2 || n == 3) return n - 1;
                int res = 1;
                while (n > 4) {
                    res *= 3;
                    n -= 3;
                }
                return res * n;
            }
  • 相关阅读:
    UVa 107 The Cat in the Hat
    UVa 591 Box of Bricks
    UVa 253 Cube painting
    UVa 10161 Ant on a Chessboard
    UVa 401 Palindromes
    UVa 465 Overflow
    我不知道
    消防局的设立
    某CF的D
    保安站岗
  • 原文地址:https://www.cnblogs.com/zmyvszk/p/5662321.html
Copyright © 2020-2023  润新知