Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

โปรแกรมค้นหาหมายเลขน่าเกลียดที่ n ใน C++


สมมติว่าเรามีตัวเลข n; เราต้องหาเลขน่าเกลียดตัวที่ n อย่างที่เราทราบกันดีว่าตัวเลขขี้เหร่คือตัวเลขเหล่านั้น ซึ่งมีตัวประกอบเฉพาะคือ 2, 3 และ 5 ดังนั้นถ้าเราต้องการหา 10 th จำนวนน่าเกลียด ผลลัพธ์จะเป็น 12 เนื่องจากตัวเลขที่น่าเกลียดสองสามตัวแรกคือ 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 เป็นต้น

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้:

  • กำหนดอาร์เรย์ v ขนาด (n + 1)
  • ถ้า n เหมือนกับ 1 แล้ว:
    • คืน 1
  • สอง :=2, สาม :=3, ห้า :=5
  • twoIdx :=2, threeIdx :=2, fiveIdx :=2
  • สำหรับการเริ่มต้น i :=2 เมื่อฉัน <=n อัปเดต (เพิ่ม i ขึ้น 1) ทำ:
    • curr :=ขั้นต่ำสอง สาม และห้า
    • v[i] :=curr
    • ถ้า curr เหมือนกับสอง ดังนั้น:
      • สอง :=v[twoIdx] * 2;
      • (เพิ่ม twoIdx โดย 1)
    • ถ้าสกุลเงินเท่ากับสาม ดังนั้น:
      • สาม :=v[threeIdx] * 3
      • (เพิ่ม 3Idx โดย 1)
    • ถ้าสกุลเงินเท่ากับห้า ดังนั้น:
      • ห้า :=v[fiveIdx] * 5
      • (เพิ่ม fiveIdx ขึ้น 1)
  • ส่งคืน v[n]

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น:

ตัวอย่าง

#include
using namespace std;
class Solution {
   public:
   int nthUglyNumber(int n) {
      vector v(n + 1);
      if(n == 1){
         return 1;
      }
      int two = 2, three = 3, five = 5;
      int twoIdx = 2;
      int threeIdx = 2;
      int fiveIdx = 2;
      for(int i = 2; i <= n; i++){
         int curr = min({two, three, five});
         v[i] = curr;
         if(curr == two){
            two = v[twoIdx] * 2;;
            twoIdx++;
         }
         if(curr == three){
            three = v[threeIdx] * 3;
            threeIdx++;
         }
         if(curr == five){
            five = v[fiveIdx] * 5;
            fiveIdx++;
         }
      }
   return v[n];
   }
};
main(){
   Solution ob;
   cout << (ob.nthUglyNumber(15));
}

อินพุต

15

ผลลัพธ์

24