我的教授让我做一个测试哥德巴赫猜想的程序。我想知道我是否应该将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
答案 0 :(得分:2)
你可以考虑1
一个素数,正如Goldbach所做的那样,或者不是更常见的用法,它对猜想几乎没有区别。
将1
视为素数会产生这种影响:
2
的解决方案:1 + 1
。4
的第一对是[{1}},而不是1 + 3
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)。
就你与教授打交道时,你最好问他想要什么。