使用 C++ 查找不能被 [2, 10] 范围内的任何数字整除的数字

c++server side programmingprogramming

在本文中,我们将讨论从 1 到 n(给定)的数字的问题,这些数字不能被 2 到 10 之间的任何数字整除。让我们通过一些示例来理解这一点 −

输入:num = 14
输出:3
说明:有三个数字,1、11 和 13,它们不能被整除。

输入:num = 21
输出:5
说明:有五个数字 1、11、13、17 和 19,它们不能被整除。

寻找解决方案的方法

简单方法

如果我们检查从 1 到 num 的每个数字,看它是否可以被从 2 到 10 的任何数字整除。如果不能,则增加计数。但这种方法会花费太多时间,因此增加了时间复杂度。

高效方法

我们能想到的最佳方法是首先找到从 1 到 num 的数字,这些数字可以被 [ 2, 10 ] 范围内的任何数字整除,然后用 num 减去这个计数。

因此,首先,我们需要找到所有可以被 2、3、4、5、10 整除的数字。但是能被 4、6、8 和 10 整除的数字也能被 2 整除,能被 3 整除的数字能被 6 和 9 整除。

我们需要找出所有能被 2、3、5 和 7 整除的数字。我们可以根据包含-排斥原理计算出来。

包含-排斥原理

它指出我们应该包括每一个集合的大小,你应该删除成对交集的大小,所有三个集合的交集的大小都应该相加,等等。

查找所有数字的公式是,

= NUM – X + Y – Z + A.

其中,

X = num divisible by 2, 3, 5, 7 ( [num / 2] + [num / 3] + [num / 5] + [num / 7] )

Y = num divisible by (2,3), (2, 5), (2, 7), (3, 5), (3, 5), (3, 7) and (5, 7) = ( [num / (2 * 3)] + [num / (2 * 5)] + [num / (2 * 7)] + [num / (3 * 5)] + num / (3 * 7)] + [num / (5 * 7)] ).

Z = num divisible by (2, 3, 5), (2, 3, 7), (2, 5, 7) and (3, 5, 7) = ( [num / (2 * 3 * 5)] + [num / (2 * 3 * 7)] + [num / (2 * 5 * 7)] + [num / (3 * 5 * 7)] )

A = num divisible by (2, 3, 5, 7) = ( [num / (2 * 3 * 5 * 7)] )

示例

#include <bits/stdc++.h>
using namespace std;

int main() {
   int n = 21, result;
   // 应用包含 - 排除原则的公式
   // 找出不能被 2 到 10 之间的任何数字整除的数字的数量。
   result = n - n / 2 - n / 3 - n / 5 - n / 7
      + n / 6 + n / 10 + n / 14 + n / 15 + n / 21 + n / 35
      - n / 30 - n / 42 - n / 70 - n / 105 + n / 210;
   cout << "未被 [2, 10] 整除的数字数量为:<< result;

   return 0;
}

输出

未被 [2, 10] 整除的数字数量为:5

结论

在本文中,我们讨论了从 2 到 n 查找不可整除数字的方法。为了解决这个问题,我们讨论了包含-排除原则。我们还讨论了应用该方法以 O(1) 复杂度获得结果的 C++ 程序。您可以使用任何其他语言(如 Java、C、Python 等)编写此程序。我们希望您觉得这篇文章有用。


相关文章