本文共 1757 字,大约阅读时间需要 5 分钟。
今天我遇到了一个编程问题,感觉有点难度。题目是关于判断两个数字是否近似,要求精确到小数点后一位。我的思路是先比较每一位的差异,看看是否有超过一位的差异。
首先,我需要确保两个数字的长度相同。如果长度不一样,直接返回“No”。然后,检查每一位,从最高位开始,计算绝对值的差。如果某一位的差绝对值大于1,就算错了,返回“No”。然后,我发现如果有多个位的差绝对值是1,那也算错。比如,第一位差1,第二位也差1,这样的情况也应该返回“No”。
我尝试写了下面的代码:
#includeusing namespace std;string a, b;int n;bool boolean() { int l = a.size(); bool f = 0; for (int i = 0; i < l; i++) { if (abs(a[i] - b[i]) == 1 && f == 0) { continue; } else { f = 1; return 0; } } return 1;}int main() { cin >> a; while (1) { cin >> b; if (b == "-1") break; if (a.size() != b.size()) { printf("No\n"); continue; } if (boolean()) { printf("Yes\n"); } else { printf("No\n"); } } return 0;}
但是这个代码有问题。比如,当第一位差1,第二位差0,第三位差1时,函数会在第二位检查时发现第一位差1,继续检查第二位,发现差0,继续检查第三位,发现差1,返回0。这样会误判为错误,但实际上应该是错误的,因为有超过一位差1了。
正确的逻辑应该是,只要有超过一位的差绝对值是1,就返回错误。所以,我需要在遍历每一位时,检查是否已经有位的差绝对值是1。如果有,就直接返回错误。
修改后的代码应该是:
#includeusing namespace std;string a, b;int n;bool boolean() { int l = a.size(); bool f = 0; for (int i = 0; i < l; i++) { if (abs(a[i] - b[i]) > 1) { f = 1; return 0; } if (abs(a[i] - b[i]) == 1 && f == 0) { f = 1; } } return 1;}int main() { cin >> a; while (1) { cin >> b; if (b == "-1") break; if (a.size() != b.size()) { printf("No\n"); continue; } if (boolean()) { printf("Yes\n"); } else { printf("No\n"); } } return 0;}
这样,代码会在发现任何一位差的绝对值大于1时,立即返回错误,且只会在所有位都差0或1的情况下返回正确。
转载地址:http://amwb.baihongyu.com/