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

ค้นหาจำนวนเฉพาะ K ในอาร์เรย์ที่ (A[i] % K) เป็นค่าสูงสุดใน C++


สมมติว่าเรามีอาร์เรย์ A ที่มีจำนวนเต็ม n เราต้องหาองค์ประกอบ K หนึ่งตัวเพื่อให้ K เป็นจำนวนเฉพาะ และ A[i] mod K เป็นค่าสูงสุดสำหรับค่า i ที่ถูกต้องทั้งหมดจากค่าที่เป็นไปได้ทั้งหมดของ K หากไม่พบตัวเลขดังกล่าว ให้คืนค่า -1 ตัวอย่างเช่น ถ้า A =[2, 10, 15, 7, 6, 8, 13] ผลลัพธ์จะเป็น 13 มีตัวเลขเฉพาะ 3 จำนวน 2, 7 และ 13 ค่าที่เป็นไปได้สูงสุดของ A[i] mod 2 คือ 1 (15 mod 2) สำหรับ 7 มันจะเป็น 6 mod 7 =6 และสำหรับ 13 มันจะเป็น 10 mod 13 =10 นี่คือจำนวนสูงสุด

ในการเพิ่มค่า A[i] mod K ให้สูงสุด K ต้องเป็นจำนวนเฉพาะสูงสุดใน A และ A[i] ต้องเป็นองค์ประกอบที่ยิ่งใหญ่ที่สุดจากอาร์เรย์ที่น้อยกว่า K ดังนั้นเราจะหาจำนวนเฉพาะสูงสุดใน อาร์เรย์ เพื่อให้ได้สิ่งนั้น เราสามารถใช้ Sieve เพื่อค้นหาจำนวนเฉพาะทั้งหมดที่น้อยกว่าหรือเท่ากับองค์ประกอบสูงสุดจากอาร์เรย์ จากนั้นหาจำนวนเฉพาะสูงสุดจากอาร์เรย์แล้วพิมพ์ออกมา หากไม่มีจำนวนเฉพาะ ให้คืนค่า -1

ตัวอย่าง

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int getMaxPrime(int arr[], int n) {
   int max_elem = *max_element(arr, arr + n);
   vector<bool> prime_vals(max_elem + 1, true);
   prime_vals[0] = false;
   prime_vals[1] = false;
   for (int p = 2; p * p <= max_elem; p++) {
      if (prime_vals[p] == true) {
         for (int i = p * 2; i <= max_elem; i += p)
         prime_vals[i] = false;
      }
   }
   int maximum = -1;
   for (int i = 0; i < n; i++) {
      if (prime_vals[arr[i]])
      maximum = max(maximum, arr[i]);
   }
   return maximum;
}
int main() {
   int arr[] = { 2, 10, 15, 7, 6, 8, 13 };
   int n = sizeof(arr) / sizeof(arr[0]);
   cout << "Max prime is: " << getMaxPrime(arr, n);
}

ผลลัพธ์

Max prime is: 13