C语言程序 哥德巴赫猜想

这是我的代码


#include<stdio.h>

unsigned int isp(unsigned int k,unsigned int n)
{
    unsigned int i;
    for (i = 2; k > i && k % i == 0; i++)
        return 0;
    if ((k * k) <= n && n % k == 0)
        return 0;
    else
        return 1;

}


unsigned int funB(unsigned int n)
{
    unsigned int k, t;
    printf("%d", n);
    for (k = 3; k <= n - k; k += 2)
    {
        t = isp(k, n - k);
         if (t == 1)
            printf("=%u+%u", k, n - k);

    }
     return 0;
}
int main()
{
    unsigned int n;
    printf("输入大于2的偶数:");
    scanf("%u", &n);
    funB(n);
    return 0;}

但是运行效果不对

img

k=15明显是错的,但是又改不对,怎么办呢?大家有什么好方法吗?
顺带一提请不要使用chatgpt回答,我学习的层级太低,看不懂chatgpt的回答,很多专业词汇还没有学到,望请包容(

```

``` )

老老实实用普通方法写吧

bool is_prime(unsigned int n) {
    if (n <= 1) {
        return 0;
    }
    for (unsigned int i = 2; i * i <= n; ++i) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;
}

把判读两个数是否为素数的函数isp()修改下应该就可以了。

修改如下:

参考链接:

哥德巴赫猜想(世界近代三大数学难题之一)_百度百科 哥德巴赫1742年在给欧拉的信中提出了以下猜想:任一大于2的整数都可写成三个质数之和。但是哥德巴赫自己无法证明它,于是就写信请教赫赫有名的大数学家欧拉帮忙证明,但是一直到死,欧拉也无法证明。因现今数学界已经不使用“1也是素数”这个约定,原初猜想的现代陈述为:任一大于5的整数都可写成三个质数之和。(n>5:当n为偶数,n=2+(n-2),n-2也是偶数,可以分解为两个质数的和;当n为奇数,n=3+(n-3),n-3也是偶数,可以分解为两个质数的和)欧拉在回信中也提出另一等价版本,即任一大于2的偶数都可写成两个质数之和。常见的猜想陈述为欧拉的版本。把命题“任一充分大的偶数都可以表示成为一个素因子个数不超过a个的数与另一个素因子不超过b个的数之和”记作“a+b”。1966年陈景润证明了“1+2”成立,即“任一充分大的偶数都可以表示成二个素数的和,或是一个素数和一个半素数的和”。常见的猜想陈述为欧 https://baike.baidu.com/item/%E5%93%A5%E5%BE%B7%E5%B7%B4%E8%B5%AB%E7%8C%9C%E6%83%B3/72364

验证“哥德巴赫猜想”c++_c++验证哥德巴赫猜想_weixin_45891756的博客-CSDN博客 #059:验证“歌德巴赫猜想”总时间限制: 1000ms 内存限制: 65536kB描述验证“歌德巴赫猜想”,即:任意一个大于等于6的偶数均可表示成两个素数之和。输入输入只有一个正整数x。(x<=2000)输出如果x不是“大于等于6的偶数”,则输出一行:Error!否则输出这个数的所有分解形式,形式为:x=y+z其中x为待验证的数,y和z满足y+z=x,而且y<=... https://blog.csdn.net/weixin_45891756/article/details/104434926


#include<stdio.h>

unsigned int isp(unsigned int k,unsigned int n)
{
    unsigned int i;
    // 用于判断k是否不为素数,如果k可以整除2到k-1之间的任意一个数,则不是素数,返回 0
    for (i = 2; i<k ; i++){
        if(k%i==0){
             return 0;
        } 
    }
       

// 同上, 用于判断k是否不为素数,如果k可以整除2到k-1之间的任意一个数,则不是素数,返回 0
    for (i = 2; i<n ; i++){
        if(n%i==0){
             return 0;
        } 
    }
    
    // 经过上面两步,执行到这一步,说明k和n都是素数,返回1 
    return 1;
 
}
 
// https://baike.baidu.com/item/%E5%93%A5%E5%BE%B7%E5%B7%B4%E8%B5%AB%E7%8C%9C%E6%83%B3/72364
// https://blog.csdn.net/weixin_45891756/article/details/104434926
unsigned int funB(unsigned int n)
{
    unsigned int k, t;
    printf("%d", n);
    for (k = 3; k <= n - k; k += 2)
    {
        t = isp(k, n - k);
         if (t == 1)
            printf("=%u+%u", k, n - k);
 
    }
     return 0;
}
int main()
{
    unsigned int n;
    printf("输入大于2的偶数:");
    scanf("%u", &n);
    funB(n);
    return 0;}

img

你这个问题主要出在isp()函数上,你可以在里面打断点查看一下,当k=15时两个if都不满足,所以返回了true认为是素数

img

我们可以修改下isp(),先写一种最简单的,就是两个循环,每个分别判断k和n是不是素数,判断方法就是编译相除看能不能整除,整体代码如下:


#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

unsigned int isp(unsigned int k, unsigned int n)
{
    unsigned int i= 0;
    for (i = 2; i < k; i++) {
        if (k % i == 0) {
            return 0;
        }
    }
    for (i = 2; i < n; i++) {
        if (n % i == 0) {
            return 0;
        }
    }
    return 1;

}

unsigned int funB(unsigned int n)
{
    unsigned int k, t;
    printf("%d", n);
    for (k = 3; k <= n - k; k += 2)
    {
        t = isp(k, n - k);
        if (t == 1)
            printf("=%u+%u", k, n - k);

    }
    return 0;
}
int main()
{
    unsigned int n;
    printf("输入大于2的偶数:");
    scanf("%u", &n);
    funB(n);
    return 0;
}

再来分析下代码时间复杂度,整体为一层循环,时间复杂度为0(n),基本还是可以的