Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

숫자와 숫자의 합 사이의 차이가 C++에서 L보다 작지 않은 숫자의 개수

<시간/>

우리는 숫자 N과 다른 숫자 L이 주어집니다. 목표는 숫자 자체와 그 자릿수의 합이 L보다 작지 않은 1과 N 사이의 숫자를 찾는 것입니다.

N=23, L=10이면 이러한 숫자의 개수는 4가 됩니다.

23-(2+3)=18, 22-(2+2)=18, 21-(2+1)=18, 20-(2+0)=18.

위의 모든 숫자는 조건을 충족합니다.

그러나 19-(1+9)=9는 L보다 작으며 마찬가지로 18,17….1.

예를 들어 이해하자

입력 − N=30 L=19

출력 − L보다 작지 않은 숫자와 자릿수의 합이 − 1이 되도록 하는 숫자의 개수

설명 − 30개만 조건을 충족합니다. 30-(3+0)=27> 19

입력 − N=123330 L=5466

출력 − L보다 작지 않은 숫자의 합과 숫자의 차이가 − 6841인 숫자의 개수

아래 프로그램에서 사용된 접근 방식은 다음과 같습니다.

이진 검색을 사용하여 조건을 충족하는 첫 번째 숫자를 찾습니다. 해당 숫자가 num이면 num+1 등에 대해서도 조건이 참이 됩니다.

현재 mid 값이 조건을 충족하면 mid와 end 사이의 모든 숫자도 이 조건을 충족하므로 단순히 end-mid+1을 추가하여 계산할 수 있습니다.

  • num과 L을 long 변수로 사용합니다.

  • 함수 Digit_sum(LL num)은 숫자 num을 받아 숫자의 합을 반환합니다.

  • 초기 합계를 total=0으로 취합니다.

  • while 루프를 사용하여 알림 num%10을 합계에 추가하고 num을 10만큼 줄입니다. num>0이 될 때까지 이 작업을 수행합니다.

  • num의 자릿수의 합계로 합계를 반환합니다.

  • 함수 Less_than_L(LL num, LL L)은 숫자 num과 숫자 L을 취해 숫자와 숫자의 합이 L보다 작지 않도록 숫자의 개수를 반환합니다.

  • 초기 카운트를 0으로 합니다.

  • start=1 및 end=num인 while 루프를 사용하여 이진 검색을 구현합니다.

  • 중간 숫자를 temp=(start+end)/2로 계산합니다.

  • temp와 temp의 자릿수의 합이 L보다 작지 않으면 temp보다 큰 모든 숫자도 동일한 조건을 만족합니다.

  • temp를 포함한 숫자의 개수는 num-temp+1이 됩니다. 이것을 추가하여 계산합니다. 그리고 end=temp-1을 설정합니다.

  • 그렇지 않으면 start=temp+1로 설정하십시오.

  • 이진 검색의 끝에서 카운트는 그들 사이의 차이와 L 이상의 자릿수 합을 가진 숫자를 갖습니다.

  • 결과로 카운트를 반환합니다.

예시

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int Digit_sum(LL num){
   LL total = 0;
   while (num > 0){
      total += num % 10;
      num = num/10;
      z}
   return total;
}
LL Less_than_L(LL num, LL L){
   LL count = 0;
   LL start = 1;
   LL end = num;
   while (start <= end){
      LL temp = (end + start) / 2;
      LL temp_2 = temp - Digit_sum(temp);
      if (temp_2 >= L){
         count = num - temp + 1;
         end = temp - 1;
      }
      else{
         start = temp + 1;
      }
   }
   return count;
}
int main(){
   LL num = 234516;
   LL L = 235;
   cout<<"Count of Numbers such that difference between the number and sum of its digits not
   less than L are: "<< Less_than_L(num, L);
   return 0;
}

출력

위의 코드를 실행하면 다음 출력이 생성됩니다 -

Count of Numbers such that difference between the number and sum of its digits not less than L are: 234267