【问题标题】:Four-tuple distance to zero issue四元组零距离问题
【发布时间】:2018-02-08 05:48:23
【问题描述】:

我正在学校做一个项目,该项目要求我们开发一个程序来计算非负整数的四元组到零的距离。

描述为“假设您从一个非负整数 (a,b,c,d) 的四元组开始,并且您反复应用此规则: (a,b,c,d) → (|a−b|,|b−c|,|c−d|,|d−a|) 也就是说,将 a 替换为 |a−b|,将 b 替换为 |b−c|,将 c 替换为 |c−d|,将 d 替换为 |d−a|。 事实证明,最终,您将获得四元组 (0,0,0,0)。例如,从 (7, 3, 6, 1) 开始并重复应用上述规则,我们得到 (7,3,6,1) → (4,3,5,6) → (1,2,1,2) → (1,1,1,1) → (0,0,0,0) 在这种情况下,将 (7, 3, 6, 1) 转换为 (0, 0, 0, 0) 需要应用四次规则,所以我们说它到零的距离是四。”

到目前为止我得到的是:

int [] array = new int []{a, b, c, d};
    int counter = 0;

    while (array[0] != 0 && array[1] != 0 && array[2] != 0 && array[3] != 0){

        array[0] = (int) Math.abs(array[0]-array[1]);

        array[1] = (int) Math.abs(array[1]-array[2]);

        array[2] = (int) Math.abs(array[2]-array[3]);

        array[3] = (int) Math.abs(array[3]-array[0]);
        counter++;
    }

但是,它没有打印出我需要的内容,也不知道从那里去哪里,有什么帮助吗?

示例:当 a、b、c 和 d 设置为 7、3、6 和 1 时,将其打印为 (1,0,0,1) 而不是 (0,0,0,0)

【问题讨论】:

    标签: java arrays math tuples


    【解决方案1】:

    问题是您将array[0] 重新分配给一个新值,然后在array[3] 中使用该值,尽管您想使用“旧”值。您应该使用中间变量

    int arr0 = array[0];
    
    array[0] = (int) Math.abs(arr0-array[1]);
    
    array[1] = (int) Math.abs(array[1]-array[2]);
    
    array[2] = (int) Math.abs(array[2]-array[3]);
    
    array[3] = (int) Math.abs(array[3]-arr0);
    

    类似的东西。此外,如果您想停止使用四元组 (0,0,0,0) 而不是在一个条目为零时立即停止,请将您的 while 标头更改为

    while ((array[0] != 0) || (array[1] != 0) || (array[2] != 0) || (array[3] != 0))
    

    否则,像 (7,7,6,1) 这样的元组会导致您的循环在第一步之后终止,这不是您想要的。

    【讨论】:

    • 我还将条件从 && 更改为 || . +1
    • @c0der 确实是这样,我编辑了,谢谢
    【解决方案2】:

    见cmets:

    int [] array = new int []{7, 3, 6, 1};
    int counter = 0;
    
    //the right condition is OR. If one in non zero - continue the computation
    //&& will also produce correct results but perform with unneeded checks  
    while ((array[0] != 0) || (array[1] != 0) || (array[2] != 0) || (array[3] != 0)){
    
        int arr0 = array[0]; //keep and use to calc array[3]
    
        array[0] = Math.abs(array[0]-array[1]);
        array[1] = Math.abs(array[1]-array[2]);
        array[2] = Math.abs(array[2]-array[3]);
        array[3] = Math.abs(array[3]-arr0);
    
        counter++;
    }
    
    System.out.println(Arrays.toString(array)+ " Counter="+ counter);
    

    【讨论】:

    • 谢谢!初始化一个新整数似乎很明显。像我这样的初学者经常犯这样的错误哈哈
    • 没关系。这就是你学习的方式。我认为应该接受@Banana 的答案,因为他是第一个发布正确答案的人。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    相关资源
    最近更新 更多