有一个自然数n。您必须找到一对自然数x,y,它们的总和为n,并且在其他具有总和n的自然数中也具有最小的能量。

Energy(x) = sum of all digits of x
Total Energy = Energy(x) + Energy(y)

1 <= n <= 10^9

For eg,
n = 10000
A few pairs:
5000 + 5000 -> Energy = 10
1000 + 9000 -> Energy = 10
9999 + 1 -> Energy = 37
2999 + 7001 -> Energy = 37

So possible answers are:
(5000, 5000), (1000, 9000) etc


到目前为止,我已经尝试了上述解决方案,但这不是一种优化的方法

我将从1循环到n-1,然后尝试所有对并检查其数字总和,但是对于大数将花费太多时间。
例如

n= 50

1,49--> energy 14
2,48--> energy 14
3,47--> energy 14
4,46--> energy 14
5,45--> energy 14
.
.
.
.
10,40-->energy 5


(编辑)经过一番思考,我得出了以下解决方案。如果有人可以提出更好的解决方案,将不胜感激

public int sum(int n) {
    String s = String.valueOf(n);
    if (isNonZeroOnlyOne(n)) {
        int num = getNonZeroNo(n);
        if (num == 1)
            return 10;
        return num;
    }
    return calculateEnergy(s);
}

private int calculateEnergy(String s) {
    int sum = 0;
    for(int i=0; i<s.length(); i++)
        sum += s.charAt(i) - '0';
    return sum;
}

private int getNonZeroNo(int n) {
    String s = String.valueOf(n);
    for(int i=0; i<s.length(); i++) {
        char c = s.charAt(i);
        if (c != '0')
            return c-'0';
    }
    return '0';
}

private boolean isNonZeroOnlyOne(int n) {
    String s = String.valueOf(n);
    int count = 0;
    for(int i=0; i<s.length(); i++) {
        char c = s.charAt(i);
        if (c != '0')
            count++;
        if (count > 1)
            return false;
    }
    return true;
}

最佳答案

最小的能量可以通过一个简单的公式得出。

1)给定N> 100,该对可以为N-100和100,并且能量将与N的能量相同。
例如:N = 500;对= 400和100;能量= 5

2)N> = 10并且N 例如:N = 50;对= 40和10;能量= 5

3)N> = 2并且N 例如:N = 5;对= 4和1;能量= 5

关于java - 在总和为n的所有对中找到能量最少的一对自然数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60183101/

10-09 02:58