По заданному четному числу n> 2 найдите простые числа, сумма которых равна n. Должен использовать функцию, которая находит простые числа.
Может начать что то подобное? :
for (int i = 2; i < n; i++)
{
if (IsPrime(i) && IsPrime(n - i))
break;
}
Это работает для меня ..
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) Чтобы проверить, является ли число N простым, вы можете перебирать до N / 2 и прерывать, если найдете его кратным. Вложенный цикл for будет самым простым решением, если вы не будете сильно беспокоиться о сложности пространства и времени.
Я дам вам только подсказку, а не полное решение, которое станет отправной точкой!
Это одно из возможных решений, а не решение:
Прежде всего, определите функцию, которая проверяет, является ли число простым:
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);
}
Это работает, и это 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;
}
псевдокод
это оставляет вам домашнюю работу по C ++
другое решение (возможно, более эффективное для одного прогона)