우리는 정수 범위, 제수로 사용되는 변수 m 및 숫자 'd'가 짝수 위치에 있는지 확인하는 데 사용되는 변수 d가 제공되며 작업은 해당 숫자의 개수를 계산하는 것입니다. 변수 m으로 나눌 수 있고 짝수 위치에 숫자 d가 있는 범위.
예
입력 - int 시작 =20, 끝 =50, d =8 및 m =4
출력 - m으로 나누어지고 짝수 위치에 숫자 d가 있는 범위의 숫자 개수는 다음과 같습니다. 2
설명 - 범위는 20에서 50까지입니다. 따라서 숫자가 8인 가능한 숫자는 28, 38 및 48이며 짝수 위치, 즉 2에서 8이 있고 숫자 24와 48은 m 즉 4로 나눌 수 있으므로 개수는 2입니다.
입력 - int 시작 =10, 끝 =100, d =6 및 m =2
출력 - m으로 나눌 수 있고 짝수 위치에 숫자 d가 있는 범위의 숫자 개수는 다음과 같습니다. 8
설명 - 범위는 10에서 100까지입니다. 따라서 6, 16, 26, 36, 46, 56, 66, 76, 86 및 96과 같은 숫자 d가 있는 가능한 숫자는 에 있는 숫자 6과 66을 제외하고 짝수 위치에 6이 있습니다. 홀수 위치에 있으므로 이것을 포함하지 않을 것이며 이제 2로 나누어 떨어지는 목록의 숫자를 확인하여 모든 숫자(예:16, 26, 36, 46, 56, 76, 86 및 96)가 2로 나눌 수 있으므로 개수를 계산합니다. 8입니다.
아래 프로그램에서 사용된 접근 방식은 다음과 같습니다.
- 변수 시작부터 변수 끝까지 정수 범위를 만들고 변수 d와 m을 선언하고 값을 입력합니다. 추가 처리를 위해 데이터를 함수에 전달합니다.
- vec라고 가정해 봅시다. 벡터 유형의 변수를 생성합니다.
- 변수 start 내부의 값이 될 때까지 루프를 시작합니다. 이제 while 내부에서 값을 val % 10으로 벡터에 푸시하고 val을 val / 10으로 설정합니다.
- vec.begin() 및 vec.end()를 인수로 전달하여 STL에서 역함수를 호출합니다.
- memset을 사용하여 배열의 값을 -1로 설정합니다.
- 짝수 위치에 있는 숫자가 m으로 나누어 떨어지는지 확인하는 함수인 set_total(0, 0, 0, vec) 반환
- set_totalfunction-:
- 내부
- IF place가 벡터의 크기인지 확인한 다음 IF temp =0을 확인한 다음 1을 반환하거나 0을 반환합니다.
- IF Arr[place][temp][val]이 -1과 같지 않은지 확인한 다음 arr[place][temp][val]의 값을 반환합니다.
- IF 장소 % 2 =1을 확인한 다음 IF val =0을 확인한 다음 IF d가 vec[place]보다 큰지 확인한 다음 0을 반환합니다.
- temp_2 변수를 선언하고 0으로 설정합니다.
- IF d가 vec[place]보다 작은지 확인한 다음 temp_2를 1로 설정합니다.
- 변수 temp_3을 선언하고 set_total()을 재귀적으로 호출하고 arr[place][temp][val] =temp_3을 반환합니다.
- 결과를 저장할 변수 개수를 선언합니다.
- set_limit 변수를 선언하고 9로 설정합니다. IF val은 1과 같습니다. ELSE는 vec[place]로 설정합니다.
- set_limit까지 i에서 0까지 FOR 루프를 시작하고 i가 d와 같은지 확인한 다음 계속하십시오.
- 변수를 temp_2로 선언하고 val로 설정
- vec[place]보다 작은지 확인한 다음 temp_2를 1로 설정
- set_total 함수에 대한 재귀 호출로 개수 설정
- arr[place][temp][val] =count를 반환합니다.
예시
#include <bits/stdc++.h>
using namespace std;
int arr[20][20][2];
int d, m;
int set_total(int place, int temp, int val, vector < int > vec) {
if (place == vec.size()) {
if (temp == 0) {
return 1;
}
return 0;
}
if (arr[place][temp][val] != -1) {
return arr[place][temp][val];
}
if (place % 2) {
if (val == 0) {
if (d > vec[place]) {
return 0;
}
}
int temp_2 = val;
if (d < vec[place]) {
temp_2 = 1;
}
int temp_3 = set_total(place + 1, (10 * temp + d) % m, temp_2, vec);
return arr[place][temp][val] = temp_3;
}
int count = 0;
int set_limit = (val ? 9 : vec[place]);
for (int i = 0; i <= set_limit; i++) {
if (i == d) {
continue;
}
int temp_2 = val;
if (i < vec[place]) {
temp_2 = 1;
}
count += set_total(place + 1, (10 * temp + i) % m, temp_2, vec);
}
return arr[place][temp][val] = count;
}
int divisible(int val) {
vector < int > vec;
while (val) {
vec.push_back(val % 10);
val = val / 10;
}
reverse(vec.begin(), vec.end());
memset(arr, -1, sizeof(arr));
return set_total(0, 0, 0, vec);
}
int main() {
int start = 20, end = 50;
d = 8, m = 4;
int count = divisible(end) - divisible(start);
cout << "Count of Numbers in a Range divisible by m and having digit d in even positions are: " << count;
return 0;
} 위의 코드를 실행하면 다음과 같은 출력이 생성됩니다 -
출력
Count of Numbers in a Range divisible by m and having digit d in even positions are: 2