#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。为什么它不能那样工作?
答案 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);