Два простых числа равны четному числу

По заданному четному числу n> 2 найдите простые числа, сумма которых равна n. Должен использовать функцию, которая находит простые числа.

Может начать что то подобное? :

for (int i = 2; i < n; i++)
{
if (IsPrime(i) && IsPrime(n - i))
break;
}

-3

Решение

Это работает для меня ..

public ArrayList<Integer> primesum(int A) {

ArrayList<Integer> result = new ArrayList<Integer>();
if(A < 2)
return result;

int first = 2;
int second = A - first;
while(first <= second){
second = A - first;

if(isPrime(second) == true && isPrime(first)){
result.add(first);
result.add(second);
return result;
}
first++;
}

return result;

}public boolean isPrime(int n)
{
if(n==1)
return false;
for(int i=2;i<=Math.sqrt(n);i++) {
if(n%i==0)
return false;
}
return true;
}
1

Другие решения

Я думаю, что это домашнее задание, поэтому я дам вам советы для начала:

1) Чтобы проверить, является ли число N простым, вы можете перебирать до N / 2 и прерывать, если найдете его кратным. Вложенный цикл for будет самым простым решением, если вы не будете сильно беспокоиться о сложности пространства и времени.

0

Я дам вам только подсказку, а не полное решение, которое станет отправной точкой!

Это одно из возможных решений, а не решение:

Прежде всего, определите функцию, которая проверяет, является ли число простым:

bool isPrime(const unsigned& number) {
for (unsigned i = 2; i < number; i++) {
if (number % i == 0) {
return false;
}
}
return true;
}

Определите также:

struct PrimeSum {
unsigned first;
unsigned second;
};

PrimeSum searchPrimeAddend(const unsigned& number, const vector<unsigned>& v) {
// your code to find two number iterating the vector
}

В вашем основном:

int main(const int argc, const char* argv[]) {
const unsigned N = 13;
std::vector<unsigned> primeList;
for (unsigned i = 3; i < N; i += 2) {
if (isPrime(i)) {
primeList.push_back(i);
}
}
PrimeSum primes = searchPrimeAddend(N, primeList);
}
0

Это работает, и это C ++

bool isPrime(int number){
if (number == 1)
return false;

if (number == 2)
return true;

for (int i = 2; i <= number / 2; ++i)
if (number % i == 0)
return false;

return true;
}

vector<int> Solution::primesum(int A) {
std::vector<int> vect;
int pivot = A / 2; // the prime numbers cannot cross each other in the middle

// keep j less than the i. i will be the lower bound of the number and
// j will be the higher bound
int j = A-2;
for (int i = 2; i <= pivot && j >= pivot; i++, j--){
if (isPrime(i) && isPrime(j)){
vect.push_back(i);
vect.push_back(j);
return vect;
}
}

return vect;
}
0

псевдокод

  • найти все простые числа до n и заполнить контейнер (упорядоченный по вставке или по контейнеру)
  • для контейнера получите прямой итератор «вверх» и обратный итератор «вниз»
  • в то время как (до! = конец && вниз! = Rend && * вверх<= * Вниз)
    • сумма = * вверх + * вниз
    • если сумма == п
      • сохранить пару // найдено
      • ++вверх
    • иначе, если сумма> п
      • ++вниз
    • иначе, если сумма < N
      • ++вверх

это оставляет вам домашнюю работу по C ++

другое решение (возможно, более эффективное для одного прогона)

  • найти все простые числа до n / 2 и заполнить контейнер (заказано вставкой или контейнером)
  • для контейнера get forward итератор ‘up’
  • пока (до! = конец)
    • другой = n — * вверх
    • если is_prime (другое)
      • сохранить пару * вверх, другое
    • ++вверх
-1
По вопросам рекламы [email protected]