สมมติว่าเรามีจำนวนเต็ม N และ M สองจำนวน เราต้องหาจำนวนขั้นตอนขั้นต่ำในการไปถึง M จาก N โดยดำเนินการตามที่กำหนด -
- คูณจำนวน x ด้วย 2 ดังนั้น x จะเป็น 2*x
- ลบหนึ่งจากจำนวน x ดังนั้นจำนวนจะเป็น x – 1
ถ้า N =4 และ M =6 ผลลัพธ์จะเป็น 2 ดังนั้นหากเราดำเนินการหมายเลข 2 บน N ดังนั้น N จะกลายเป็น 3 จากนั้นดำเนินการหมายเลขหนึ่งกับค่าที่อัพเดตของ N ดังนั้นมันจะกลายเป็น 2 * 3 =6 ดังนั้นจำนวนขั้นตอนขั้นต่ำจะเป็น 2
เพื่อแก้ปัญหานี้ เราจะปฏิบัติตามกฎเหล่านี้ -
- เราสามารถย้อนกลับปัญหาได้ เหมือนเราใช้หมายเลข N เริ่มจาก M ดังนั้นการดำเนินการใหม่สองรายการจะเป็น
-
- หารจำนวนด้วย 2 เมื่อเป็นเลขคู่
- บวก 1 ด้วยตัวเลข
- ตอนนี้จำนวนการดำเนินการขั้นต่ำจะเป็น
- ถ้า N> M ให้คืนค่าส่วนต่างระหว่างกัน ดังนั้นจำนวนขั้นตอนจะเพิ่ม 1 ถึง M จนกว่าจะเท่ากับ N
- มิฉะนั้น เมื่อ N
ตัวอย่าง
#include<iostream>
using namespace std;
int countMinimumSteps(int n, int m) {
int count = 0;
while(m > n) {
if(m % 2 == 1) {
m++;
count++;
}
m /= 2;
count++;
}
return count + n - m;
}
int main() {
int n = 4, m = 6;
cout << "Minimum number of operations required: " << countMinimumSteps(n, m);
} ผลลัพธ์
Minimum number of operations required: 2