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

ตัวเลขสุดน่าเกลียดในภาษา C++


เราต้องสร้างฟังก์ชันขึ้นมาหนึ่งฟังก์ชันเพื่อค้นหาจำนวนที่น่าเกลียดสุดอันดับที่ n ตัวเลขที่น่าเกลียดอย่างยิ่งเป็นจำนวนบวกที่มีตัวประกอบเฉพาะทั้งหมดอยู่ในจำนวนเฉพาะรายการเฉพาะของขนาด k ดังนั้นหาก n คือ 12 และจำนวนเฉพาะคือ [2, 7, 13, 19] แล้วผลลัพธ์จะเป็น 32 นั่นเป็นเพราะ [1, 2, 4, 7, 8, 13, 14, 16, 19, 26, 28, 32] เป็นลำดับของตัวเลขที่น่าเกลียดมาก 12 ตัว

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

  • สร้างโครงสร้างข้อมูล triplet ด้วย num, prime และ idx

  • ถ้า n เป็น 1 ให้คืนค่า 1 สร้างอาร์เรย์ขนาด n + 1 แล้วเติมด้วย 1

  • กำหนดลำดับความสำคัญของคิว pq

  • สำหรับฉันอยู่ในช่วง 0 ถึงขนาดของจำนวนเฉพาะ−

    • สร้างแฝดสาม t(primes[i], primes[i], 2)

  • สำหรับฉันอยู่ในช่วง 2 ถึง n

    • curr :=องค์ประกอบด้านบนของ pq จากนั้นลบออกจาก pq

    • val :=จำนวนสกุลเงิน

    • v[i] :=วาล

    • num ของ curr :=ไพรม์ของ curr * v[index of curr]

    • เพิ่มดัชนีของสกุลเงินโดย 1

    • ใส่เคอร์เนลลงใน pq

    • ในขณะที่ val =num ของ pq ด้านบน

      • curr :=ด้านบนของ pq และลบออกจาก pq

      • num ของ curr :=ไพรม์ของ curr * v[index of curr]

      • เพิ่มดัชนีของสกุลเงินโดย 1

      • ใส่เคอร์เนลลงใน pq

  • กลับ v[n]

ตัวอย่าง (C++)

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

#include <bits/stdc++.h>
using namespace std;
struct Data{
   int num, prime, idx;
   Data(int a, int b, int c){
      num = a;
      prime = b;
      idx = c;
   }
};
struct Comparator{
   bool operator()(Data a, Data b){
      return !(a.num < b.num);
   }
};
class Solution {
   public:
   int nthSuperUglyNumber(int n, vector<int>& primes) {
      if(n == 1)return 1;
      vector <int> v(n + 1, 1);
      priority_queue < Data, vector < Data >, Comparator > pq;
      for(int i = 0; i < primes.size(); i++){
         pq.push(Data(primes[i], primes[i], 2));
      }
      int x;
      for(int i = 2; i <= n; i++){
         Data curr = pq.top();
         pq.pop();
         int val = curr.num;
         v[i] = val;
         curr.num = curr.prime * v[curr.idx];
         curr.idx++;
         pq.push(curr);
         while(val == pq.top().num){
            curr = pq.top();
            pq.pop();
            curr.num = curr.prime * v[curr.idx];
            curr.idx++;
            pq.push(curr);
         }
      }
      return v[n];
   }
};
main(){
   Solution ob;
   vector<int> v = {2,7,13,19};
   cout << (ob.nthSuperUglyNumber(12, v));
}

อินพุต

12
[2,7,13,19]

ผลลัพธ์

32