ในปัญหานี้ เราได้รับค่าจำนวนเต็มสองค่า 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