给定数字 N 的约数中能被 K 整除的约数个数
查找给定数字 N 的约数中也能够被 K(任意常数)整除的约数个数是一个典型的数学问题,需要大量的计算。这里,K 通常是一个小于或等于 N 的平方根的数字。但是,我们可以构建一个 C++ 程序,通过该程序,计算这些数字将变得更容易。
在本文中,我们将讨论 C++ 中的不同方法,使用这些方法我们可以找到上述问题的解决方案。
输入输出场景
如果我们考虑以下场景,这里我们有 N 值为 50,K 值为 5。50 的约数是 1、2、5、10、25、50,其中 5、10、25、50 能被 5 整除。因此,输出应该为4。
Input: N = 50, K = 5 Output: 4
同样,如果我们考虑 N 值为 120。
120 的约数是 1、2、3、4、5、6、8、10、12、15、20、24、30、40、60、120。
其中能被 K 即 10 整除的数字是 10、20、30、40、60 和 120。
因此,120 的约数中能被 10 整除的约数个数为6。
Input: N = 120, K = 10 Output: 6
使用 For 循环和 && 运算符
这是一种简单的方法,我们使用for循环迭代 1 到 N 之间的值。在for循环中,我们使用if语句查找满足所需条件的数字的计数。这些条件是:
该数字应该是 N 的约数。
并且应该能被 K 整除。
要检查数字的可除性,我们使用模运算符。
模运算符 (%) - 此运算符用于获取除法运算的余数。如果除法的余数为零,则表示被除数能被除数整除。例如,(25 % 5) 为 0,因此 25 能被 5 整除。
示例
在下面的示例中,我们尝试计算 100 的约数中能被 5 整除的约数个数。
#include <iostream> using namespace std; int findNumberOfDivisors(int N, int K){ // Variable to store the result int find = 0, x; // Iterate from 1 to N for(x = 1; x <= N; x++){ if (N % x == 0 && x % K == 0){ find++; } } return find; } int main(){ // Declaring values of N and K int N = 100, K = 5; cout << "Number of divisors of " << N << " which are divisible by " << K << " are " << findNumberOfDivisors(N, K); return 0; }
输出
Number of divisors of 100 which are divisible by 5 are 6
迭代到 N 的平方根
我们还有另一种替代解决方案,在这里我们将优化我们的循环,迭代从 1 到 N 的平方根。
在这种方法中,我们将使用约数的一个属性,该属性指出约数总是成对出现的,并且其中一个约数小于或等于该数字的平方根。
例如,如果 N = 100,则约数对为:(1, 100)、(2, 50)、(4, 25)、(5, 20)、(10, 10)。
因此,如果循环,我们将搜索小于给定数字的平方根的数字。
然后,我们检查该数字是否为 N 的约数,并且是否也能被 K 整除。如果两个条件都满足,我们将递增count变量。
为了避免在从 1 到 √(N) 迭代时重复计算同一个约数,我们编写另一个 if 语句。此外,我们检查 N/x 是否为 K 的因子(因为 x 是N的约数,并且x能被K整除)。如果两个条件都满足,我们需要再次递增count变量。
此方法减少了所需的迭代次数。因此,它通过降低时间复杂度来提高性能。
注意− cmath是 C++ 标准库头文件,它使开发人员能够执行数学函数和运算,如 sin()、cos()、pow()、sqrt() 等。
示例
以下是一个示例:
#include <iostream> #include <cmath> using namespace std; // Function for finding the number int findNumberOfDivisors(int N, int K){ // variable to store the result int find = 0, x; // Iterate from 1 to √(N) for (x = 1; x <= sqrt(N); x++) { // Check if x is divisor of N if (N % x == 0) { // Check if x is divisible by K if (x % K == 0) { find++; } if (x != N / x && (N / x) % K == 0) { find++; } } } return find; } int main(){ // Declaring values of N and K int N = 100, K = 5; cout << "Number of divisors of " << N << " which are divisible by " << K << " are " << findNumberOfDivisors(N, K); return 0; }
输出
Number of divisors of 100 which are divisible by 5 are 6
结论
我们已经探索了各种技术,这些技术可用于计算给定数字N的约数中能被K整除的约数个数。我们已经看到了不同的方法,包括在for循环中使用模运算符和优化的循环技术。
模运算符方法是一种易于使用的方法,而优化的循环技术是一种有效的方法,可以提高性能。现在,问题出现了:哪种方法更好?答案是,这取决于问题的需求和N的大小。