在C ++中abs(* a-* b)不返回负数的绝对值

时间:2019-03-01 07:21:36

标签: c pointers

#include <stdio.h>
#include <cmath>

void update(int *a,int *b) {
    // Complete this function 
    (*a) = abs(*a + *b);
    (*b) = abs(*a - *b);   
}

int main() {
    int a, b;
    int *pa = &a, *pb = &b;

    scanf("%d %d", &a, &b);
    update(pa, pb);
    printf("%d\n%d", a, b);

    return 0;
}

我有以下代码(来自HackerRank C ++问题)。如果我有4和5作为输入,它将返回9和4作为输出,而不是9和1。我认为它将变为4-5 = abs(-1)=1。为什么它不能那样工作?

5 个答案:

答案 0 :(得分:3)

您在第一行重新分配了*a,并且在第二行使用了新值。您需要一个临时设备来避免这种情况,例如:

int origa = *a;
*a = abs(origa + *b);
*b = abs(origa - *b);

或者,您可以看上tuple s:

std::tie(*a, *b) = std::make_tuple(abs(*a + *b), abs(*a - *b));

它只是先计算并打包这些值,然后在完成所有读取后解压缩它们。

答案 1 :(得分:1)

 `void update(int *a,int *b) {
    // Complete this function
    *a=*a+*b;
    *b=abs(*a-(2**b));
}`    
使用

(2**b) 是因为在上一步中我们已将 *a 的值更改为 *a+*b。 所以我们要减去 2 次。

*b = abs (*a - (2 * (*b));

*b = abs (9 - (2 * (5));

*b = abs (9 - (10));

*b = 绝对 (-1);

*b = 1;

答案 2 :(得分:0)

如果要在不使用临时变量的情况下执行此操作,则可以这样做:

void update(int *a, int *b) {
    // Complete this function 
    (*a) = abs(*a + *b);
    (*b) = abs(*a - *b -*b);
  }

答案 3 :(得分:0)

宁可使用此代码,因为它很简单。如果减去后b的值为负。我们只是乘以-1。

int origa = *a;
*a = origa + *b;
*b = origa - *b;
if (*b <0)
{
    *b=-1*(*b);
}

答案 4 :(得分:0)

"a" 在执行 (*a) = abs(*a + *b); 后得到新值,所以现在 "b" 得到 "a" 的最新值,这就是为什么它给出 4 而不是 1 (a=4+5=9,b = 9-5=4)。所以声明一个临时变量,像这样对 a 和 b 都使用它。

int temp=*a;
*a = temp+*b;
*b = abs(temp-*b);