숫자 범위를 정의하기 위해 두 개의 숫자 START와 END가 제공됩니다. 또한 양수 Arr[]의 배열입니다. 목표는 Arr[]의 모든 요소로 나눌 수 있고 [START,END] 범위에 있는 모든 숫자를 찾는 것입니다.
방법 1(순진한 접근)
START에서 END까지 숫자를 탐색하여 이를 수행하고 각 숫자에 대해 숫자가 배열의 모든 요소로 나눌 수 있는지 확인합니다. 예인 경우 카운트를 증가시킵니다.
방법 2(배열 요소의 LCM으로 분할 가능성 확인)
모든 배열 요소의 LCM을 찾은 다음 해당 LCM으로 완전히 나눌 수 있는 [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) 함수는 범위 변수와 배열을 가져와 모든 배열 요소로 나눌 수 있는 숫자의 개수를 반환합니다.
-
이러한 숫자에 대해 초기 변수 개수를 0으로 간주합니다.
-
변수 플래그를 0으로 사용
-
for 루프를 사용하여 숫자 범위를 탐색합니다. i=시작에서 i=끝
-
이제 각 숫자 num=i에 대해 while 루프를 사용하여 숫자가 모든 배열 요소로 나눌 수 있는지 확인합니다.
-
모든 요소가 num을 완전히 나누면 flag=1을 설정합니다.
-
외부 while if flag=1 증가 카운트
-
모든 루프의 끝에서 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(LCM 접근법)
아래 프로그램에서 사용한 접근 방식은 다음과 같습니다.
-
범위 변수로 정수 START 및 END를 사용합니다.
-
함수 getLCM(int a, int b)은 두 개의 숫자를 사용하고 while 루프를 사용하여 둘 다 나누어 떨어지는 첫 번째 숫자를 찾아 LCM을 반환합니다.
-
함수 getLCMArray(int arr[], int n)는 배열과 그 길이를 입력으로 사용하고 배열의 모든 요소에 대한 LCM을 반환합니다.
-
첫 번째 LCM을 getLCM(arr[0], arr[1])으로 계산합니다. 그 후 getLCM(lcm, arr[i])을 호출하여 이전 lcm의 lcm와 arr[i]를 차례로 찾습니다. 여기서 i=2 to i
-
divisiblebyArr(int start, int end, int arr[], int len) 함수는 범위 변수와 배열을 가져와 모든 배열 요소로 나눌 수 있는 숫자의 개수를 반환합니다.
-
이러한 숫자에 대해 초기 변수 개수를 0으로 간주합니다.
-
변수 lcm를 getLCMArray(int arr[], int len)로 사용합니다.
-
for 루프를 사용하여 숫자 범위를 탐색합니다. i=시작에서 i=끝
-
이제 각 숫자 i에 대해 나눌 수 있는 lcm인지 확인하십시오. true이면 카운트를 증가시킵니다.
-
모든 루프의 끝에서 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