哥德巴赫猜想运动(c)

时间:2013-11-10 15:17:44

标签: c primes goldbach-conjecture

我的教授让我做一个测试哥德巴赫猜想的程序。我想知道我是否应该将1视为素数。这是我打印第一个素数组合的代码:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main()
{
    int n, i, j, k, l;    
    char prime, prime1;
    do   //check if n is even and greater than 2
    {
        printf("Give me an even natural number greater than 2:\n\n>");
        scanf("%d", &n);
    }
    while (n % 2 != 0 && n >= 2);
    for (i = 1; i < n ; i++) 
    {                   
        prime = 1;     
        for (k = 2; k < i; k++)  
            if (i % k == 0)
                prime = 0;
        if (prime)
        {
            for (j = 1; j < n; j++)
            {
                prime1 = 1;
                for (l = 2; l < j; l++)
                    if (j % l == 0)
                        prime1 = 0;
                if (prime1)
                    if (i + j == n)
                    {
                        printf("\n\n%d and %d are the first two prime numbers that add up to %d.\n", i, j, n);
                        return 0;
                    }
            }
        }
    }
}

我检查了互联网,几乎每个人都说1不是素数。我该怎么办?保持程序原样或更改它,以便它不会将1视为素数?我该怎么做? :P

2 个答案:

答案 0 :(得分:2)

你可以考虑1一个素数,正如Goldbach所做的那样,或者不是更常见的用法,它对猜想几乎没有区别。

1视为素数会产生这种影响:

  • 2的解决方案:1 + 1
  • 4的第一对是[{1}},而不是1 + 3
  • 如果值为素数加1,则较高偶数的第一个解可能涉及2 + 2,但是大于2的已知偶数只能表示为1

请注意,您的代码存在问题:

  • 您不检查p + 1的返回值,因此输入不是数字的字符串将导致未定义的行为(第一次scanf()未初始化)或无限循环因为n已不再修改。

  • 测试n不正确:它应该是:

    while (n % 2 != 0 && n >= 2);
  • 第一个循环可以通过测试while (n <= 2 || n % 2 != 0);

  • 迭代一半
  • 使用测试i <= n / 2

  • ,第二个循环可以迭代得更少
  • 当您检测到k * k <= i不是素数时,您可以退出第二个循环

  • 不需要第三个循环,您只需要测试i是否为素数

  • 第二次主要测试可能会有相同的改进,最好将其移至单独的功能。

  • 你应该有一条消息和n - i声明,说明你找到Goldbach猜想的反例的远程可能性; - )

以下是改进版本:

return

答案 1 :(得分:0)

你可以考虑将1作为一个素数,因为Goldbach在他给莱昂哈德·欧拉的信中也认为它是素数。但那是1被认为是素数的时候。后来它被抛弃了,因此这个是哥德巴赫的第三个另外,从今天起我们认为1既不是素数也不是复合,即使你不认为1是素数,猜想仍然适用,经过充分验证可达到4 * 10 ^ 18(经核实最多4 * 10 ^ 17)。

就你与教授打交道时,你最好问他想要什么。