給定數字 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 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告