对任一个大于4的偶数,都可以分解为两个素数之和。从文件中读入两个数m、n,编程验证。


#include
using namespace std;

int cnt = 0;

bool isprime(int n)
{
    if(n == 0 || n == 1) return false;
    for(int i = 2; i <= sqrt(n); i++)
        if(n % i == 0) return false;
    return true;
}

void goldbach(int n)
{
    for(int i = 2; i <= n / 2; i++)
        if(isprime(i) && isprime(n - i))
        {
            printf("%d+%d=%d\n", i, n - i, n);
            cnt++;
        }
}

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for(int i = n; i <= m; i += 2) goldbach(i);
    end = clock();
    printf("%d", cnt);
    return 0;
}

怎么办90分代码,TLE,还能怎么优化(咬牙切齿

制作不易,请采纳 : 我试过了是对的


#include <stdio.h>
int  isPrime(int n)
{
    int i;
    if (n <= 3)  return n > 1;
    for (i = 2; i * i <= n; i++)
        if (n % i == 0) return 0;
    return 1;
}
int main()
{
    int i, n;
    while (scanf("%d", &n) == 1 && n > 0) // 输入 <= 0  结束
    {
        if (n % 2 != 0) continue;  //输入非偶数,重新输入
        for (i = n / 2; i > 1; i--) {
            if (isPrime(i) && isPrime(n - i))
            {
                printf("%-d=%-d+%-d\n", n, i, n - i);//输出
                break;
            }
        }
    }
    return 0;
}
 

整体修改如下,供参考:

#include <stdio.h>
int cnt = 0;
int  isprime(int n)
{
    int i;
    if (n < 4)   return n > 1;
    for (i = 2; i * i <= n; i++)
        if (n % i == 0) return 0;
    return 1;
}
void goldbach(int n)
{
    for (int i = 2; i <= n / 2; i++)
        if (isprime(i) && isprime(n - i))
        {
            printf("%d+%d=%d\n", i, n - i, n);
            cnt++;
            break;    
        }
}
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);
    for (int i = n; i <= m; i++) 
        if (i >= 4 && i % 2 == 0)
            goldbach(i);
    printf("%d", cnt);
    return 0;
}

不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^