สมมติว่าเรามีอักขระ 'A' เพียงตัวเดียวในโปรแกรมแก้ไขข้อความ เราสามารถดำเนินการสองครั้งในจดหมายนี้สำหรับแต่ละขั้นตอน -
- คัดลอกทั้งหมด − เราสามารถคัดลอกอักขระทั้งหมดที่มีอยู่ในแผ่นจดบันทึกได้
- วาง − เราสามารถวางอักขระที่คัดลอกครั้งล่าสุดได้
สมมุติว่าเรามีตัวเลข n เราต้องได้ n 'A' บนแผ่นจดบันทึกโดยทำตามขั้นตอนขั้นต่ำที่อนุญาต เราต้องหาผลลัพธ์ในจำนวนขั้นตอนขั้นต่ำเพื่อให้ได้ n 'A' ดังนั้นหาก n ที่กำหนดคือ 3 คำตอบจะเป็น 3 ดังนั้นในตอนแรกจะมี "A" เพียงตัวเดียว ตอนนี้ให้คัดลอกและวางสิ่งนี้ ดังนั้นจะมี "AA" ในตอนนี้ ตอนนี้เราสามารถวางได้อีกครั้ง ดังนั้นจะมีการใส่ 'A' หนึ่งอัน ดังนั้นเราจะได้ “AAA”
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- ret :=0
- สำหรับ k ในช่วง 2 ถึง n
- ในขณะที่ n mod k ไม่ใช่ 0
- ret :=ret + k และ n :=n / k
- ในขณะที่ n mod k ไม่ใช่ 0
- คืนสินค้า
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
int minSteps(int n) {
int ret = 0;
for(int k = 2; k <= n; k++){
for(; n % k == 0; ret += k, n /= k);
}
return ret;
}
};
main(){
Solution ob;
cout << (ob.minSteps(10));
} อินพุต
10
ผลลัพธ์
7