【问题标题】:Two prime numbers equals even number两个素数等于偶数
【发布时间】:2012-12-05 08:32:38
【问题描述】:

给定一个偶数n>2,求和为n的素数。必须使用找到素数的函数。

也许可以开始这样的事情? :

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

【问题讨论】:

  • 是的,听起来是一个合理的起点。
  • 是的,这个算法应该可以工作
  • 提示:你真的需要迭代到n吗?
  • 您需要自己编写IsPrime()函数吗?我建议Sieve of Eratosthenes。这不是最优雅的解决方案,但它很容易理解,并且每个 学习程序员都会在某个时候编写。用所有小于n 的素数填充std::vector,然后从底部遍历列表,对于每个素数p&lt;n/2,检查n-p 是否在列表中。 (这不一定是执行此操作的“最佳”方式,但对于初学者来说没问题)。
  • 第一步是证明哥德巴赫猜想,留给读者作为练习。

标签: c++ primes


【解决方案1】:

这对我有用..

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;
}

【讨论】:

    【解决方案2】:

    我认为这是一个家庭作业,所以我会给你一些开始的提示:

    1) 要检查一个数 N 是否为素数,您可以迭代到 N/2 并在找到它的倍数时中断。如果您不太关心空间和时间的复杂性,嵌套的 for 循环将是最简单的解决方案。

    【讨论】:

    • 有一个N/2的下限,可以节省很多时间。
    【解决方案3】:

    我只是给你一个提示,而不是整个解决方案,这将是起点!

    这是可能的解决方案之一,而不是解决方案:

    首先,定义一个检查数字是否为素数的函数:

    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);
    }
    

    【讨论】:

    • 只是一个小问题:你的isPrime 函数不会将 2 检测为素数,如果它是。然而,对于 赋值的目的,这并不重要,因为 所有其他 素数都是奇数,而偶数和奇数的总和总是奇数。
    【解决方案4】:

    这是可行的,它是 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;
    }
    

    【讨论】:

      【解决方案5】:

      伪代码

      • 找到直到 n 的所有素数并填充一个容器(按插入或容器排序)
      • 为容器获取正向迭代器“向上”和反向迭代器“向下”
      • while (up!=end && down!=rend && *up
      • sum = *up + *down
      • 如果总和 == n
        • 保存对 // 找到
        • ++向上
      • 否则如果总和> n
        • ++向下
      • 否则如果总和
      • ++向上

      这给你留下了一些 C++ 作业

      不同的解决方案(单次运行可能更有效)

      • 找到 n/2 以内的所有素数并填充一个容器(按插入或容器排序)
      • 为容器获取转发迭代器“向上”
      • 同时(向上!=结束)
        • 其他 = n - *向上
        • 如果是_prime(其他)
          • 保存对 *up,其他
        • ++向上

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-05
        • 2021-11-12
        • 2017-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多