给定数字 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的大小。

更新于: 2023年7月12日

280 次浏览

开启你的职业生涯

通过完成课程获得认证

开始学习
广告