c++ - C++。逻辑表达式
问题描述
我正在尝试解决以下任务。给定一个整数 x,我想计算 2 个数字(a 和 b),它们是:
- 1) 可被 2 或 3 整除(例如 a % 2 == 0 或 a % 3 == 0 )
- 2) x = a + b
我写了下面的代码,找到了这样的a和b。
cin >> x;
if (x % 2 == 0) {
a = b = x / 2;
} else {
a = x / 2;
b = a + 1;
}
while((a % 3 !=0 || a % 2 != 0) && (b % 2 != 0 || b % 3 != 0)) {
a++;
b--;
}
但是它不起作用。例如,当 x 为 13 时,它会打印出 a = 6 和 b = 7。但是 7 不能被 2 或 3 整除。有什么问题?
解决方案
仔细检查您的延续条件(其中n
是一些任意整数,可能在每次使用中都不同,例如a != 3n
简单地表示它a
不是三的倍数)。我将展示这个过程:
while((a % 3 != 0 || a % 2 != 0) && (b % 2 != 0 || b % 3 != 0))
( a != 3n OR a != 2n ) AND ( b != 2n OR b != 3n )
( a != 6n ) AND ( b != 6n )
它说:继续,而两者a
都不是二和三的倍数, 也不是二和b
三的倍数。换句话说,只有当两者和都是六的倍数时,它才会继续。另一方面,如果不是六的倍数,它当然会退出。a
b
a
b
由于13
集合a = 6
和的输入值b = 7
,延续情况在第一次迭代时为假(七不是六的倍数)。
也许最好重新考虑确定某些数字组合是否有效的方式(a)。例如(假设数字必须介于1
和之间N - 1
,否则,您的解决方案空间可能是无限的),您可以使用以下内容:
#include <iostream>
int main() {
// Get the number.
int num;
std::cout << "Number? ";
std::cin >> num;
// Check all i + j = n for 1 <= i,j < n.
for (int i = 1, j = num - 1; i < j; ++i, --j) {
// Disregard if either number not a multiple of 2 or 3.
if ((i % 2) != 0 && (i % 3) != 0) continue;
if ((j % 2) != 0 && (j % 3) != 0) continue;
std::cout << num << " => " << i << ", " << j << "\n";
return 0;
}
std::cout << num << " => no solution\n";
return 0;
}
请注意,我使用的i < j
是for
延续条件,这是假设它们必须是不同的数字。如果允许它们是相同的数字,请将其更改为i <= j
.
(a)使用所有and
、or
和not
(甚至隐含地,通过反转继续和退出条件),有时比它的价值更麻烦,因为 De Morgan 的定理往往会发挥作用:
_____ _ _
A ∩ B ⇔ A ∪ B : (not(A and B)) is ((not A) or (not B))
_____ _ _
A ∪ B ⇔ A ∩ B : (not(A or B)) is ((not A) and (not B))
在这种情况下,如果您打破个别检查,代码会变得更具可读性。
有趣的是,如果您使用相当多的输入值运行该代码,您会看到这样的模式:如果存在解决方案,则该解决方案中的一个数字始终是 2 或 3。
这是因为,除了总和小于 5 的病理情况(或者如果允许解决方案具有相同的数字,则小于 4):
- 每个偶数
2n, n > 1
都是 和 的总和2
,2n - 2
都是两个 (2n - 2 = 2(n - 1)
) 的倍数;和 - 每个奇数
2n + 1, n > 2
都是 和 的3
和2n + 1 - 3
,第一个是三的倍数,第二个是二的倍数 (2n + 1 - 3 = 2n - 2 = 2(n - 1)
)。
所以,实际上,不需要循环:
if (num < 5) { // 4 if allowing duplicates.
std::cout << num << " => no solution\n";
} else {
int first = (num % 2) == 0 ? 2 : 3;
std::cout << num << " => " << first << ", " << (num - first) << "\n";
}
这实际上对某些数字给出了不同的结果,例如,17 = 2 + 15 = 3 + 14
但两种解决方案仍然是正确的。
推荐阅读
- docker - 使用 make 在 docker 容器中编译时出错
- reactjs - 多次调用 React 组件构造函数
- list - 生成每个第 n 个元素都不同的列表
- unity3d - Unity 第一人称鼠标控制无法正常工作
- r - 重新编码 R 数据框列中的数据
- docker - 在 gcp 上安装 docker
- reactjs - 传递道具 - React
- python - 我的 for i in range 循环只迭代一次,我需要迭代 19 次才能创建单独的模型
- applescript - AppleScript:复制文件,用午夜的秒数重命名,然后打开它
- string - 如何在 golang 中将 %3a 或 %a 存储在 String 中?