Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 풀어보는 숫자와 그 뒤집은 수의 차이가 k의 배수인 숫자 세기

범위 [l, r]과 정수 k가 주어졌을 때, l부터 r 사이(l ≤ 숫자 ≤ r)에 있는 숫자 중에서 그 숫자를 뒤집은 값과 원래 숫자의 차이가 k의 배수가 되는 모든 숫자를 찾는 것이 목표입니다.

이 조건을 확인하려면 l부터 r까지 각 숫자를 순회하면서 해당 숫자의 뒤집은 값을 계산합니다. 그다음 뒤집은 값에서 원래 숫자를 뺀 절댓값이 k로 나누어떨어지는지(|차이| % k == 0) 검사하고, 만족한다면 카운트를 증가시킵니다.

예제를 통해 자세히 이해해 보겠습니다.

입력 − L=21, R=25, K=6

출력 − 조건을 만족하는 숫자 개수 − 2

설명

각 숫자, 뒤집은 값, 그리고 차이는 다음과 같습니다:
21, 12, | 21-12 |=9, 9%6!=0
22, 22, | 22-22 |=0, 0%6=0 → count=1
23, 32, | 32-23 |=9, 9%6!=0
24, 42, | 42-24 |=18, 18%6=0 → count=2
25, 52, | 52-25 |=27, 27%6!=0
조건을 만족하는 숫자는 총 2개입니다 (22, 24)

입력 − L=11, R=15, K=5

출력 − 조건을 만족하는 숫자 개수 − 1

설명

유일하게 조건을 만족하는 숫자는 11입니다. | 11-11 |=0이고 0%5=0이므로 조건을 충족합니다.

알고리즘 접근 방법

  • 범위를 정의하는 두 정수 L과 R, 그리고 나눗셈 검사를 위한 K를 입력받습니다.

  • countNumbers(int l, int r, int k) 함수는 l, r, k를 매개변수로 받아 조건을 만족하는 숫자의 개수를 반환합니다.

  • 초기 카운트(count)를 0으로 설정합니다.

  • 뒤집은 숫자를 저장할 변수 rev를 0으로 초기화합니다.

  • 나머지를 저장할 변수 rem을 0으로 초기화합니다.

  • i = l부터 i = r까지 반복문을 실행합니다.

  • 현재 숫자 i를 num에 저장하고, rev를 0으로 초기화합니다.

  • while(num > 0) 루프를 사용해 num을 뒤집습니다: rem = num % 10, rev = rev * 10 + rem, num = num / 10.

  • while 루프가 종료되면 rev에는 i의 뒤집은 값이 저장됩니다.

  • rev와 원래 값 i의 절댓값 차이를 계산하여, | i - rev | % k == 0이면 카운트를 증가시킵니다.

  • 범위 내의 모든 숫자에 대해 위 과정을 반복합니다.

  • 최종적으로 누적된 count 값을 반환합니다. 이것이 뒤집은 수와의 차이가 k의 배수가 되는 숫자들의 개수입니다.

예제 코드

#include <iostream>
using namespace std;
int countNumbers(int l, int r, int k){
    int rev = 0;
    int count=0;
    int rem=0;
    for (int i = l; i <= r; i++){
        int num=i;
        rev=0;
        while (num > 0){
            // 숫자를 뒤집는 과정
            rem=num%10;
            rev = rev * 10 + rem;
            num /= 10;
        }
        if((abs(i-rev))%k==0) // 원래 숫자는 i, 뒤집은 숫자는 rev
            { count++; }
    }
    return count;
}
int main(){
    int L= 18, R = 24, K = 6;
    cout <<" 뒤집은 수와의 차이가 k의 배수인 숫자의 개수:"<<countNumbers(L,R,K);
    return 0;
}

실행 결과

위 코드를 실행하면 다음과 같은 출력이 생성됩니다 −

뒤집은 수와의 차이가 k의 배수인 숫자의 개수:4