有一个自然数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/