哥德巴赫猜想程序编写中的问题

问题描述 投票:0回答:2

我正在学习编程,我的任务是用 C++ 编写一段代码,对于给定的偶数,将返回该数字作为两个素数之和。以前我设法编写了一个代码来检查数字是否为素数,但当我尝试应用它时,我的程序失败了。

#include <iostream>
using namespace std;

int main()
{
    int a,s1=0,s2=0;
    cout<<"Enter any even natural number greater than 3."<<endl;
    cin>>a;

    for(int i=0;i<a;++i)
    {

        for(int k=2;k<=i;++k)
        {
            if(i%k!=0) s1++;
        }
        for(int t=2;t<=(a-i);++t)
        {
            if((a-i)%t!=0) s2++;
        }
        if(s1==i-2 && s2==a-i-2) cout<<a<<"="<<i<<"+"<<a-i<<endl;

    }

    return 0;
}
c++ loops primes goldbach-conjecture
2个回答
3
投票

我认为只需要一个小更改,您需要在循环内将 s1 和 s2 设置为零,而不仅仅是在

main
开始时设置一次。

for(int i=0;i<a;++i)
{
    s1=s2=0;
    ...

现在(如果您愿意)使用名为

is_prime
的函数重写代码。该函数采用一个整数参数,如果该整数是质数则返回 true(如果不是质数则返回 false)。如果您一开始就编写了这样的函数,那么您就不会犯这样的错误。

通过编写函数将复杂的问题分解为更小的问题是编程中绝对重要的技能。


0
投票

我会使用素数测试。 然后检查 a 减去 2 和 3 是否为素数。 如果两者都不起作用,请尝试 6k 个数字,例如 5,7,11,13,17,19...如果 a 减去其中一个是素数,我们就获胜了。 喜欢:

#include <iostream>
#include <cmath>
using namespace std;

bool is_prime(int n) {
   if (n<=3) return n>1;
   if ((n%6 != 1) && (n%6 != 5)) return false;
   int limit = sqrt(n);
   for (int i = 5; i<=limit; i+=6) 
       if (n%i==0 || n%(i+2)==0) return false; 
   return true;
}

int main()
{
    int a,s1=0,s2=0;
    cout<<"Enter any even natural number greater than 3."<<endl;
    cin>>a;
    if (a == 4) 
        cout<<a<<" = 2 + 2"<<endl;
    else  
       if (is_prime(a-3) ) 
        cout<<a<<" = 3 + "<<a-3<<endl;
    else {
        for(int i=5;i<=a/2;i+=6) {
            if (is_prime(i) && is_prime(a-i)) {
               cout<<a<<" = "<<i<<" + "<<a-i<<endl;
               break; 
            }
            if (is_prime(i+2) && is_prime(a-(i+2))) {
               cout<<a<<" = "<<i+2<<" + "<<a-(i+2)<<endl;
               break;
            }
        }
    }
    return 0;
}

输出:

$ g++ -o test x_gold.cpp 
$ ./test
Enter any even natural number greater than 3.
123456
123456 = 7 + 123449
© www.soinside.com 2019 - 2024. All rights reserved.