Computer >> Máy Tính >  >> Lập trình >> C ++

Đếm số bước cần thiết để giảm N xuống 1 bằng cách tuân theo quy tắc nhất định trong C ++


Chúng tôi được cung cấp một số N. Mục tiêu là đếm số bước cần thiết để giảm số xuống 1 bằng cách tuân theo các quy tắc -

  • Nếu số là lũy thừa của 2, hãy giảm nó xuống một nửa.

  • Nếu không, hãy giảm nó đến N- (lũy thừa gần nhất của 2 nhỏ hơn N).

Đối với bước 1, chúng ta sẽ kiểm tra xem N có phải là lũy thừa của 2 hay không, bằng cách kiểm tra xem ceil (log2 (N)), tầng (log2 (N)) có trả về cùng một kết quả hay không. Nếu có thì N =N / 3, số lượng hoạt động tăng dần.

Nếu kết quả của bước 1 là sai thì chúng ta sẽ thực hiện bước 2 và trừ lũy thừa gần nhất của 2 nhỏ hơn N cho N. lũy thừa gần nhất của 2 nhỏ hơn N sẽ được tính là -

x =floor (log2 (N)) → khi N không phải là lũy thừa của 2, log2 (N) cho giá trị dấu phẩy động, tầng giảm nó thành số nguyên gần nhất nhỏ hơn N.

Bây giờ N =N-pow (2, x) → pow (2, x) sẽ cho công suất gần nhất nhỏ hơn N. Giảm N.

Hãy cùng hiểu với các ví dụ.

Đầu vào - N =20

Đầu ra -:Số bước bắt buộc - 3

Giải thích - 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.

Đầu vào - N =32

Đầu ra Số bước bắt buộc - 5

Giải thích - 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.

Phương pháp tiếp cận được sử dụng trong chương trình dưới đây như sau

  • Chúng tôi lấy một số nguyên N để lưu trữ một giá trị số nguyên.

  • Hàm stepCount (int n) nhận N và trả về số bước cần thiết để giảm nó xuống còn 1.

  • Tính số bước ban đầu là 0.

  • Bây giờ while (n! =1) thực hiện cả hai bước 1 và 2 theo giá trị của n.

  • Nếu n là lũy thừa của 2 (ceil (log2 (n)) ==tầng (log2 (n)) sẽ đúng), hãy giảm n xuống còn một nửa. Số lượng tăng dần.

  • Nếu không phải là lũy thừa của 2 thì giảm n bởi pow (2, x) với x là tầng (log2 (n)). Số lượng tăng dần.

  • Khi vòng lặp kết thúc thì đếm sẽ có số hoạt động được thực hiện.

  • Số lượt trả về là kết quả mong muốn.

Ví dụ

#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;
}

Đầu ra

Nếu chúng ta chạy đoạn mã trên, nó sẽ tạo ra kết quả sau -

Count of steps required to reduce N to 1:6