이 문제에서 우리는 세 개의 값 L, R, d를 받습니다. 우리의 임무는 모든 좋은 숫자를 인쇄하는 것입니다. L~R 범위 내 d를 숫자로 포함하지 않는 것.
좋은 숫자 모든 숫자가 오른쪽 숫자의 합보다 큰 숫자입니다(모든 숫자보다 덜 중요한 비트). 예를 들어 732는 7> 3+2 및 3>2입니다.
이제 문제를 이해하기 위해 예를 들어 보겠습니다.
Input: L = 400 , R = 500 , k = 3 Output: 410, 420, 421
설명 - 400에서 500 사이의 좋은 숫자는 -
410, 420, 421, 430, but we cannot use 3 so 430 is not printed.
이 문제를 해결하기 위해 주어진 범위(예:L부터 R까지) 내의 모든 숫자를 확인합니다. 숫자가 좋은 숫자이고 그 숫자 중 하나라도 k와 같지 않으면 인쇄하고 그렇지 않으면 그대로 둡니다.
양호한 번호 확인 - 우리는 오른쪽에서 왼쪽으로 숫자를 탐색하고 합이 다음 숫자보다 크면 false를 반환하는 어느 시점에서든 합을 유지합니다.
예시
아래 알고리즘을 설명하는 프로그램을 보자 -
#include<bits/stdc++.h> using namespace std; bool isvalidNumber(int n, int d){ int digit = n%10; int sum = digit; if (digit == d) return false; n /= 10; while (n){ digit = n%10; if (digit == d || digit <= sum) return false; else{ sum += digit; n /= 10; } } return 1; } void printGoodNumbersLtoR(int L, int R, int d){ for (int i=L; i<=R; i++){ if (isvalidNumber(i, d)) cout << i << " "; } } int main(){ int L = 400, R = 600, d = 3; cout<<"All good numbers from "<<L<<" to "<<R<<" that do not contain "<<d<<" are :\n"; printGoodNumbersLtoR(L, R, d); return 0; }
출력
All good numbers from 400 to 600 that do not contain 3 are − 410 420 421 510 520 521 540