Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过连续自然数的加减来获得一个数_Java_C++_C_Algorithm_Math - Fatal编程技术网

Java 通过连续自然数的加减来获得一个数

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

我试图写一个函数,使用它我可以在最小的步骤中获得任何自然数。我可以从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 + "__________"); 
}

好的,让我们这样做吧。考虑二叉树。现在你可以从每一条路径中找到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);
    }