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 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告