博客
关于我
520 钻石争霸赛 题解
阅读量:166 次
发布时间:2019-02-27

本文共 1692 字,大约阅读时间需要 5 分钟。

今天我遇到了一个编程问题,感觉有点难度。题目是关于判断两个数字是否近似,要求精确到小数点后一位。我的思路是先比较每一位的差异,看看是否有超过一位的差异。

首先,我需要确保两个数字的长度相同。如果长度不一样,直接返回“No”。然后,检查每一位,从最高位开始,计算绝对值的差。如果某一位的差绝对值大于1,就算错了,返回“No”。然后,我发现如果有多个位的差绝对值是1,那也算错。比如,第一位差1,第二位也差1,这样的情况也应该返回“No”。

我尝试写了下面的代码:

#include 
using 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。如果有,就直接返回错误。

修改后的代码应该是:

#include 
using 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/

你可能感兴趣的文章
MSTP多生成树协议(第二课)
查看>>
MSTP是什么?有哪些专有名词?
查看>>
Mstsc 远程桌面链接 And 网络映射
查看>>
Myeclipse常用快捷键
查看>>
MyEclipse用(JDBC)连接SQL出现的问题~
查看>>
myeclipse的新建severlet不见解决方法
查看>>
MyEclipse设置当前行背景颜色、选中单词前景色、背景色
查看>>
MyEclipse配置SVN
查看>>
MTCNN 人脸检测
查看>>
MyEcplise中SpringBoot怎样定制启动banner?
查看>>
MyPython
查看>>
MTD技术介绍
查看>>
MySQL
查看>>
mysql
查看>>
MTK Android 如何获取系统权限
查看>>
MySQL - 4种基本索引、聚簇索引和非聚索引、索引失效情况、SQL 优化
查看>>
MySQL - ERROR 1406
查看>>
mysql - 视图
查看>>
MySQL - 解读MySQL事务与锁机制
查看>>
mysql 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
查看>>