Java 通过连续自然数的加减来获得一个数
我试图写一个函数,使用它我可以在最小的步骤中获得任何自然数。我可以从1开始加减自然数。 这些条件包括: 只使用一次数字 您只能执行加法和减法运算 不允许您转义任何数字 找到具有最大值的整数的值以获得该数字 如果我想要的数字是4,那么得到的结果是-1+2+3,这里的答案是3。同样,如果我想要6,那么1+2+3这里的答案是3。对于10=1+2+3+4,ans为4。 到目前为止,我所拥有的: 到目前为止,我所拥有的:Java 通过连续自然数的加减来获得一个数,java,c++,c,algorithm,math,Java,C++,C,Algorithm,Math,我试图写一个函数,使用它我可以在最小的步骤中获得任何自然数。我可以从1开始加减自然数。 这些条件包括: 只使用一次数字 您只能执行加法和减法运算 不允许您转义任何数字 找到具有最大值的整数的值以获得该数字 如果我想要的数字是4,那么得到的结果是-1+2+3,这里的答案是3。同样,如果我想要6,那么1+2+3这里的答案是3。对于10=1+2+3+4,ans为4。 到目前为止,我所拥有的: 到目前为止,我所拥有的: public void step() { int n = (int)Mat
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 + "__________");
}
好的,让我们这样做吧。考虑二叉树。现在你可以从每一条路径中找到sum,然后用sum=你的数字,比如说4,走每一条路径。现在,您可以从中获得最大值。试着想出实现这一点的方法。如果你尝试一下,我可以进一步帮助你
0
/ \
-1 1
/ \ / \
-2 2 -2 2
解决办法是:
其中Sk>n且x=Sk-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,S4=10,10-7=3,这很奇怪,所以k=5,S5=15,x=15-7=8,8/2=4,翻转4的符号,我们得到1+2+3-4+5=7
在某些情况下,Sk-n是奇数,但是Sk+1-n也是奇数,在这种情况下,我们需要使用Sk+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);
}
你试过什么吗?嗯,这是什么样的家庭作业!我们将帮助您解决特定的编程问题,但您需要自己编写一个程序来解决逻辑问题。是的,我的代码是public void步骤{int n=intMath.sqrtposition*2;k=position-n+1*n/2;l=n+1*n+2/2-position;System.out.printlnk++l;System.out.printlnn;p=l>k?k:l;r=l>k?n:n+1;System.out.printlnp++r;如果k==0{result=n;}else{result=r+2*p;}System.out.println\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu+result+\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu}但是这不合适,我想它需要一些递归函数?
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);
}