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

ค้นหาตัวหารน้อยที่สุดที่ k ของจำนวนธรรมชาติ N ใน C++


ในปัญหานี้ เราได้รับค่าจำนวนเต็มสองค่า N และ k งานของเราคือ หาตัวหารน้อยที่สุดที่ k ของจำนวนธรรมชาติ N .

มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน

Input : N = 15, k = 3
Output : 5

คำอธิบาย

Factors of 15 are 1, 3, 5, 15
3rd smallest is 5

แนวทางการแก้ปัญหา

วิธีแก้ปัญหาอย่างง่ายคือการค้นหาปัจจัยของตัวเลขและจัดเก็บในลักษณะที่เรียงลำดับแล้วพิมพ์ค่า kth

สำหรับการ sorting เราจะวนซ้ำจนถึง root(N) และตรวจสอบว่า N หารด้วย i ลงตัวหรือไม่ และเก็บค่าของ i และ (N/i) ไว้ในอาร์เรย์แล้วจัดเรียง จากอาร์เรย์ที่จัดเรียงนี้ ให้พิมพ์ค่าที่ k

ตัวอย่าง

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

#include <bits/stdc++.h>
using namespace std;
void findFactorK(int n, int k){
   int factors[n/2];
   int j = 0;
   for (int i = 1; i <= sqrt(n); i++) {
      if (n % i == 0) {
         factors[j] = i;
         j++;
         if (i != sqrt(n)){
            factors[j] = n/i;
            j++;
         }
      }
   }
   sort(factors, factors + j);
   if (k > j)
      cout<<"Doesn't Exist";
   else
      cout<<factors[k-1];
}
int main(){
   int N = 16,
   k = 3;
   cout<<k<<"-th smallest divisor of the number "<<N<<" is ";
   findFactorK(N, k);
   return 0;
}

ผลลัพธ์

3-th smallest divisor of the number 16 is 4

แนวทางอื่น

อีกวิธีในการแก้ปัญหาคือการใช้อาร์เรย์สองชุดที่จัดเรียง

หนึ่งค่าการจัดเก็บ i เรียงลำดับจากน้อยไปมาก

ค่าการจัดเก็บอื่นๆ N/i เรียงลำดับจากมากไปน้อย

เราจะพบค่าที่น้อยที่สุดลำดับที่ k จากอาร์เรย์ทั้งสองแบบ ถ้า k มากกว่าขนาดของอาร์เรย์ ค่านั้นจะแสดงอยู่ในอาร์เรย์ที่ 2 จากค่าที่แล้ว

มิฉะนั้นจะมีอยู่ในอาร์เรย์แรก

ตัวอย่าง

โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา

#include <bits/stdc++.h>
using namespace std;
void findFactorK(int n, int k){
   int factors1[n/2];
   int factors2[n/2];
   int f1 = 0,f2 = 0;
   for (int i = 1; i <= sqrt(n); i++) {
      if (n % i == 0) {
         factors1[f1] = i;
         f1++;
         if (i != sqrt(n)){
            factors2[f2] = n/i;
            f2++;
         }
      }
   }
   if (k > (f1 + f2))
      cout<<"Doesn't Exist";
   else{
      if(k <= f1)
         cout<<factors1[f1-1];
      else
         cout<<factors2[k - f2 - 1];
   }
}
int main(){
   int N = 16,
   k = 3;
   cout<<k<<"-th smallest divisor of the number "<<N<<" is ";
   findFactorK(N, k);
   return 0;
}

ผลลัพธ์

3-th smallest divisor of the number 16 is 4