将正整数分解为至少两个正整数的总和并返回最大乘积

时间:2016-04-21 16:50:16

标签: java

所以这是最近的一个采访问题,给定一个正整数n,将其分解为至少两个正整数的总和,并最大化这些整数的乘积。返回您可以获得的最大产品。

  

例如,给定n = 2,返回1(2 = 1 + 1);给定n = 10,返回   36(10 = 3 + 3 + 4)。

我试图递归地解决它,方法是 首先将数字分成两半,找到最大乘积并保持每半分裂,直到达到最大值。

这是我的代码,

private int integerBreak(int n, int maxProduct){

        int index = 0;
        for(int i=0; i<n; i++){
            if((i * (n-i)) >maxProduct) {
                maxProduct = i*(n-i);
                index = i;
            }
        }
        return integerBreak(index, index) * integerBreak(n - index, n-index);
    }
    public int integerBreak(int n) {

        int maxProduct = 0;
        return integerBreak(n, maxProduct);

    }

现在我对如何终止递归的基本条件有点失落。如果有人可以帮我解决问题而不是想出完全不同的解决方案,我会很感激。

4 个答案:

答案 0 :(得分:2)

我编写了一个简单的Java应用程序来计算数字2到20的整数之和的最大乘积。第一个数字是总和。中间的数字是总和的因素。最终的数字是因素的乘积。结果如下。

2   [1, 1]   1
3   [2, 1]   2
4   [2, 2]   4
5   [3, 2]   6
6   [3, 3]   9
7   [4, 3]   12
8   [3, 3, 2]   18
9   [3, 3, 3]   27
10   [4, 3, 3]   36
11   [3, 3, 3, 2]   54
12   [3, 3, 3, 3]   81
13   [4, 3, 3, 3]   108
14   [3, 3, 3, 3, 2]   162
15   [3, 3, 3, 3, 3]   243
16   [4, 3, 3, 3, 3]   324
17   [3, 3, 3, 3, 3, 2]   486
18   [3, 3, 3, 3, 3, 3]   729
19   [4, 3, 3, 3, 3, 3]   972
20   [3, 3, 3, 3, 3, 3, 2]   1458

calculateMaximumFactors方法使用最大乘积计算因子。因子方法生成总和的因子。产品方法计算因子的乘积。这是代码:

package com.ggl.testing;

import java.util.Arrays;

public class MaximumProduct {

    public static void main(String[] args) {
        for (int sum = 2; sum <= 20; sum++) {
            System.out.print(sum + "   ");
            System.out.println(calculateMaximumFactors(sum));
        }
    }

    private static String calculateMaximumFactors(int sum) {
        int[] previousFactors = new int[0];
        int maxProduct = 0;

        for (int i = 2; i <= sum; i++) {
            int[] factors = factor(sum, i);
            int product = product(factors);
            if (product > maxProduct) {
                maxProduct = product;
                previousFactors = Arrays.copyOf(factors, factors.length);
            }
        }

        return Arrays.toString(previousFactors) + "   " + maxProduct;
    }

    private static int[] factor(int sum, int divisor) {
        if (sum < divisor) {
            return new int[0];
        }

        int num = sum / divisor;
        int remainder = sum % divisor;
        int[] result = new int[divisor];
        for (int i = 0; i < divisor; i++) {
            result[i] = num;
            if (remainder > 0) {
                result[i]++;
                remainder--;
            }
        }

        return result;
    }

    private static int product(int[] factors) {
        int product = 1;

        for (int i = 0; i < factors.length; i++) {
            product *= factors[i];
        }

        return product;
    }

}

答案 1 :(得分:0)

这是我解决问题的方法:(想法:将整数分解为3的倍数是最佳的)

public int integerBreak(int n) {

    // base case : 
    if (n == 2 || n == 3){ 
       return (n-1);
    }

    int maxProduct = 1;
    while (n > 4){
        n -= 3;
        maxProduct *= 3; // Keep multiplying 3.
    }
    return (n * maxProduct); // multiply with left over n.

}

这是简单的O(N)解决方案。希望这有助于某人!

答案 2 :(得分:0)

这个想法是将数字分成2或3的倍数。如果你写出7到10之类的数字的破解结果,你应该得到这个想法。假设最大数量为60,则有一个简单的动态解决方案:

int dp[60];
public:
int integerBreak(int n)
{
  dp[1]=1,dp[2]=1,dp[3]=2,dp[4]=4,dp[5]=6,dp[6]=9;
  for(int i=7;i<=n;i++)
     dp[i]=max(dp[i-3]*3,dp[i-2]*2);
  return dp[n];
}

};

答案 3 :(得分:-1)

如果你做一个循环试图找到数字然后会变得复杂而不是那么有效(数字越大,你找到它的时间越长,你需要考虑索引等等)

最好也是最快算法是中点算法,即将给定数除以2,如果数为奇数则计算偏差,最后计算产品

实施例

static int func(int number) {
        int result = 0;
        if (number < 0) {
            System.err.println("no negative allowed");
            System.exit(0);
        }
        int a = 0;
        int b = 0;
        a = number / 2;
        b = number / 2;
        a += number - (a + b);
        result = a * b;
        System.out.println(" this is a " + a);
        System.out.println(" this is b " + b);
        return result;
    }

如果你像

那样执行它
public static void main(String[] args) {
    int number = 9;
    int result = func(number);
    System.out.println(result);
}

会正确得到结果......