Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

(A[i] % K)가 C++에서 최대가 되도록 배열에서 소수 K 찾기

<시간/>

n개의 정수가 있는 배열 A가 있다고 가정합니다. K가 소수이고 A[i] mod K가 K의 가능한 모든 값 중에서 모든 유효한 i에 대해 최대인 하나의 요소 K를 찾아야 합니다. 그러한 숫자가 발견되지 않으면 -1을 반환합니다. 예를 들어, A =[2, 10, 15, 7, 6, 8, 13]이면 출력은 13이 됩니다. 세 개의 소수 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