我正在尝试编写一个函数,使用该函数我可以在最小步骤中获得任何自然数。允许我从1开始添加或减去自然数。 那里的条件是:
仅使用一次号码
您只能执行加法和减法。
您不得转义任何数字
找到具有最大值的整数的值以获得该数字。
例如:如果我想要的数字是4,则获得-1 + 2 + 3 这里答案是3 。以类似的方式,如果我想要6然后1 + 2 + 3 这里答案是3 。 10 = 1 + 2 + 3 + 4 ans 4 。
到目前为止我所拥有的:
到目前为止我所拥有的:
public void step() {
int n = (int)Math.sqrt(position * 2);
k = (position - (((n + 1) * n) / 2));
l = ((((n + 1) * (n + 2)) / 2) - position);
System.out.println(k + " " + l);
System.out.println(n);
p = (l > k ? k : l);
r = (l > k ? n : n + 1);
System.out.println(p + " " + r);
if (k == 0) {
result = n;
} else {
result = r + (2 * p);
} System.out.println("__________" + result + "__________");
}
答案 0 :(得分:2)
好的,让我们这样做吧。请考虑关注binary tree
。现在,您可以从每个路径中找到总和,并使用sum=your number(let's say 4)
获取每个路径。现在你可以从中获得最大价值。试着想出这个的实现。我可以帮你进一步,如果你尝试一些东西。
0
/ \
-1 1
/ \ / \
-2 2 -2 2
答案 1 :(得分:0)
for n=1: = 1
for n=2: = 1+2 => 1+2+3 => 1-2+3
for n=3: = 1+2
for n=4: = 1+2+3 => -1+2+3
for n=5: = 1+2+3 => 1+2+3+4-5
for n=6: = 1+2+3
for n=7: = 1+2+3+4=>1+2+3+4+5=>1+2+3-4+5
for any n, first calculate the S(k)=1+2+3+...+k
其中S(k)> n且x = S(k)-n是偶数。然后将x / 2的+翻转到 - 。
S(k) = (1+k)*k/2 > n
=> k*k + k -2n > 0
=> k > (-1 + sqrt(1+8n))/2
例如,n = 7,k> 3.2,然后k = 4,S(4)= 10,10-7 = 3,它是奇数,所以k = 5,S(5)= 15,x = 15-7 = 8,8 / 2 = 4,翻转4的符号,我们得到1 + 2 + 3-4 + 5 = 7
在某些情况下,Sk-n是奇数,但S(k + 1)-n也是奇数,在这种情况下,我们需要使用S(k + 2)。 代码如下:
public void step() {
k = (int)Math.ceil(((-1 + Math.sqrt(1 + 8 * n)) / 2));
int Sk = (1 + k) * k / 2;
if ((Sk - n) % 2 != 0) {
k++;
Sk = (1 + k) * k / 2;
if ((Sk - n) % 2 != 0) {
k++;
Sk = (1 + k) * k / 2;
}
}
int i = (Sk - n) / 2;
System.out.println("maximum number is : " + k + "the number with -ve sign is : " + i);
}