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

C++의 특정 규칙에 따라 N을 1로 줄이는 데 필요한 단계 수 계산


우리에게 숫자 N이 주어졌습니다. 목표는 다음 규칙에 따라 숫자를 1로 줄이는 데 필요한 단계 수를 계산하는 것입니다 -

  • 숫자가 2의 거듭제곱이면 절반으로 줄입니다.

  • 그렇지 않으면 N-(N보다 작은 2의 가장 가까운 거듭제곱)으로 줄입니다.

1단계에서는 ceil(log2(N)), floor(log2(N))이 동일한 결과를 반환하는지 확인하여 N이 2의 거듭제곱인지 확인합니다. 그렇다면 N=N/3, 작업 횟수를 증가시킵니다.

1단계의 결과가 거짓이면 2단계를 수행하고 N에서 N보다 작은 2의 가장 가까운 거듭제곱을 뺍니다. N보다 작은 2의 가장 가까운 거듭제곱은 -

로 계산됩니다.

x=floor(log2(N)) → N이 2의 거듭제곱이 아닐 때 log2(N)은 부동 소수점 값을 제공하고 floor는 N보다 작은 가장 가까운 정수로 감소시킵니다.

이제 N=N-pow(2,x) → pow(2,x)는 N보다 작은 2의 가장 가까운 거듭제곱을 제공합니다. N을 줄입니다.

예를 들어 이해합시다.

입력 - N=20

출력 -:필요한 단계 수 - 3

설명 - N=20

20 is not power of 2. Step 2. Reduce nearest power of 2 less than N from N. N=20- 16=4. Count=1.
4 is power of 2. Step 1. Reduce N to its half. N=4/2=2. Count=2.
2 is power of 2. Step 1. Reduce N to its half. N=2/2=1. Count=3.
N is 1 total step count=3.

입력 - N=32

출력 필요한 단계 수 - 5

설명 - N=32

32 is power of 2. Step 1. Reduce N to its half. N=32/2=16. Count=1.
16 is power of 2. Step 1. Reduce N to its half. N=16/2=8. Count=2.
8 is power of 2. Step 1. Reduce N to its half. N=8/2=4. Count=3.
4 is power of 2. Step 1. Reduce N to its half. N=4/2=2. Count=4.
2 is power of 2. Step 1. Reduce N to its half. N=2/2=1. Count=5.
N is 1 total step count=5.

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

  • 정수 값을 저장하기 위해 정수 N을 사용합니다.

  • 함수 stepCount(int n)는 N을 취하고 이를 1로 줄이는 데 필요한 단계 수를 반환합니다.

  • 초기 단계 수를 0으로 간주합니다.

  • 이제 while(n!=1) n 값에 따라 1단계와 2단계를 모두 수행합니다.

  • n이 2의 거듭제곱이면( ceil(log2(n))==floor(log2(n)) is true ), n을 절반으로 줄입니다. 증분 수.

  • 2의 거듭제곱이 아니면 n을 pow(2,x)로 줄입니다. 여기서 x는 floor(log2(n))입니다. 증분 수.

  • 루프가 끝나면 count에 수행된 작업 수가 표시됩니다.

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

예시

#include <iostream>
#include <math.h>
using namespace std;
// Function to return number of steps for reduction
int stepCount(int n){
   int count=0;
   while(n!=1){
      if(ceil(log2(n))==floor(log2(n))) //if n is power of 2 then this is true{
         n=n/2; //reduce n to half
         count++;
      } else {
         int x=floor(log2(n)); //floor value
         n=n-(pow(2,x)); //2^x is nearest power of 2 which is less than n
         count++;
      }
   }
   return count;
}
int main(){
   int N = 96;
   cout <<"Count of steps required to reduce N to 1:"<<stepCount(N);
   return 0;
}

출력

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

Count of steps required to reduce N to 1:6