2020年4月16日

今天在刷题的时候,做到这样的一道题:

我一开始给出的解法是这样的:

#include <bits/stdc++.h>

void update(int *a,int *b) {
    // Complete this function 
    (*a) = (*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;
}

编译能过,但是WA。当时我百思不得其解,到底是哪里错了呢?后来我看了其他人的解法之后发现,是(* a)的值在经过了第一条语句之后已经改变了,所以需要一个变量来存放(* a)的初始值。顿时觉得自己太憨了,所以记录一下,提醒自己以后要多注意这个问题。以下是修正后的代码:

#include <bits/stdc++.h>

void update(int *a,int *b) {
    // Complete this function 
    int temp = (*a);
    (*a) = (*a) + (*b);
    (*b) = abs(temp-(*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;
}

还从这次犯傻经历中学到,以后再出现类似问题,纠结10分钟无果后,及时去参考其他人的代码,说不定能给自己启发。同时,看其他人的解法,也有利于扩展思路,就像我是用abs函数来计算绝对值,但也有人用if来输出相反数。对数组的逆序输出,我是用reverse函数,但也有人是用容器、两个for循环(++、--)来输出。