四元组距离为零问题

时间:2018-02-08 05:48:24

标签: java arrays math tuples

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

描述读取"假设您从一组四元非负整数(a,b,c,d)开始,并且您反复应用此规则: (a,b,c,d)→(| a-b |,| b-c |,| c-d |,| d-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)

2 个答案:

答案 0 :(得分:4)

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

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 ((array[0] != 0) || (array[1] != 0) || (array[2] != 0) || (array[3] != 0))

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

答案 1 :(得分:2)

见评论:

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);