C++ 中計算範圍內可被陣列所有元素整除的數字


給定兩個數字 START 和 END 來定義一個數字範圍,以及一個正數陣列 Arr[]。目標是找到所有在 [START,END] 範圍內且可被 Arr[] 中所有元素整除的數字。

方法 1(樸素方法)

我們將從 START 到 END 遍歷數字,並對每個數字檢查它是否可以被陣列中的所有元素整除。如果是,則遞增計數。

方法 2(檢查陣列元素的最小公倍數)

我們將找到所有陣列元素的最小公倍數,然後檢查並計算 [START,END] 範圍內所有完全可被該最小公倍數整除的數字。

讓我們用例子來理解。

輸入

START=1 END=20 Arr[]= { 2, 4, 8 }

輸出

Numbers that are divisible by all array elements: 2

解釋

Numbers 8 and 16 are in the range that are divisible by all array elements.

輸入

START=100 END=200 Arr[]= { 230, 321, 490, 521 }

輸出

Numbers that are divisible by all array elements: 0

解釋

No number between 100 to 200 divisible by any array element.

方法 1(樸素方法)

下面程式中使用的方法如下

  • 我們將整數 START 和 END 作為範圍變數。

  • 函式 divisiblebyArr(int start, int end, int arr[], int len) 獲取範圍變數和陣列,並返回可被所有陣列元素整除的數字的計數。

  • 將初始變數 count 設定為 0,表示此類數字的數量。

  • 將變數 flag 設定為 0

  • 使用 for 迴圈遍歷數字範圍。i=start 到 i=end

  • 現在,對於每個數字 num=i,使用 while 迴圈檢查該數字是否可以被所有陣列元素整除。

  • 如果所有元素都完全整除 num,則將 flag 設定為 1。

  • 在 while 迴圈外,如果 flag=1,則遞增 count

  • 在所有迴圈結束時,count 將包含可被陣列所有元素整除的數字的總數。

  • 返回 count 作為結果。

示例

即時演示

#include <bits/stdc++.h>
using namespace std;
int divisiblebyArr(int start, int end, int arr[], int len){
   int count = 0;
   int flag=0;
   int index=0;
   for (int i = start; i <= end; i++){
      int num = i;
      index=0;
      while(index<len){
         if(num % arr[index++] == 0)
            { flag=1; }
         else{
            flag=0;
            break;
         }
      }
      if (flag == 1)
         { count++; }
      }
   return count;
}
int main(){
   int START = 5, END = 20;
   int Arr[] = {2,4,8 };
   int len=sizeof(Arr)/sizeof(Arr[0]);
   cout <<"Numbers that are divisible by all array elements: "<< divisiblebyArr(START,END,Arr,len);
   return 0;
}

輸出

如果我們執行以上程式碼,它將生成以下輸出:

Numbers that are divisible by all array elements: 2

方法 2(最小公倍數方法)

下面程式中使用的方法如下

  • 我們將整數 START 和 END 作為範圍變數。

  • 函式 getLCM(int a, int b) 獲取兩個數字並返回它們的最小公倍數,方法是使用 while 迴圈找到第一個同時可被這兩個數字整除的數字。

  • 函式 getLCMArray(int arr[], int n) 獲取一個數組及其長度作為輸入,並返回陣列所有元素的最小公倍數。

  • 計算第一個最小公倍數為 getLCM(arr[0], arr[1])。之後,透過呼叫 getLCM(lcm, arr[i]) 連續查詢前一個最小公倍數和 arr[i] 的最小公倍數,其中 i=2 到 i<n。

  • 函式 divisiblebyArr(int start, int end, int arr[], int len) 獲取範圍變數和陣列,並返回可被所有陣列元素整除的數字的計數。

  • 將初始變數 count 設定為 0,表示此類數字的數量。

  • 將變數 lcm 設定為 getLCMArray(int arr[], int len)。

  • 使用 for 迴圈遍歷數字範圍。i=start 到 i=end

  • 現在,對於每個數字 i,檢查它是否可以被 lcm 整除。如果是,則遞增 count。

  • 在所有迴圈結束時,count 將包含可被陣列所有元素整除的數字的總數。

  • 返回 count 作為結果。

示例

即時演示

#include <bits/stdc++.h>
using namespace std;
int getLCM(int a, int b){
   int m;
   m = (a > b) ? a : b;
   while(true){
      if(m % a == 0 && m % b == 0)
         return m;
      m++;
   }
}
int getLCMArray(int arr[], int n){
   int lcm = getLCM(arr[0], arr[1]);
   for(int i = 2; i < n; i++){
      lcm = getLCM(lcm, arr[i]);
   }
   return lcm;
}
int divisiblebyArr(int start, int end, int arr[], int len){
   int count = 0;
   int flag=0;
   int lcm=getLCMArray(arr,len);
   for (int i = start; i <= end; i++){
      if(i%lcm==0)
         { count++; }
      }
   return count;
}
int main(){
   int START = 5, END = 20;
   int Arr[] = {2,4,8 };
   int len=sizeof(Arr)/sizeof(Arr[0]);
   cout <<"Numbers that are divisible by all array elements: "<< divisiblebyArr(START,END,Arr,len);
   return 0;
}

輸出

如果我們執行以上程式碼,它將生成以下輸出:

Numbers that are divisible by all array elements: 2

更新於: 2020-10-31

550 次瀏覽

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告