我的教授让我做一个程序来测试Goldbach猜想。我想知道我是否应该把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是素数?我该怎么做呢?
发布于 2017-02-18 18:19:38
您可以像Goldbach那样将1看作一个素数,也可以不像更常见的用法那样,它对猜想几乎没有影响。
将1视为素数具有这样的效果:
2有一个解决方案:1 + 1。4的第一对是1 + 3而不是2 + 21,如果该值是素数加1,但任何已知的大于2的偶数都不能表示为p + 1。请注意,您的代码中存在问题:
scanf()的返回值,因此输入一个不是数字的字符串将导致未定义的行为(第一次n未初始化)或无限循环,因为n不再被修改。while (n % 2 != 0 && n >= 2);不正确:应该是:
时间(n,<= 2=n%2 != 0);i <= n / 2迭代一半的时间。k * k <= i进行更少的迭代。i不是素数时,可以退出第二个循环。n - i是否为素数return语句,以防止您找到Goldbach猜想的反示例;)下面是一个改进的版本:
#include <stdio.h>
#define PRIME_MASK ((1ULL << 2) | (1ULL << 3) | (1ULL << 5) | (1ULL << 7) |\
(1ULL << 11) | (1ULL << 13) | (1ULL << 17) | (1ULL << 19) | \
(1ULL << 23) | (1ULL << 29) | (1ULL << 31) | (1ULL << 37) | \
(1ULL << 41) | (1ULL << 43) | (1ULL << 47) | (1ULL << 53) | \
(1ULL << 59) | (1ULL << 61))
int isprime(unsigned long long n) {
if (n <= 63)
return (PRIME_MASK >> n) & 1;
if (n % 2 == 0)
return 0;
for (unsigned long long k = 3; k * k <= n; k += 2) {
if (n % k == 0)
return 0;
}
return 1;
}
int main(void) {
unsigned long long n, i;
int r;
for (;;) {
printf("Give me an even natural number greater than 2:\n>");
r = scanf("%llu", &n);
if (r == 1) {
if (n % 2 == 0 && n > 2)
break;
} else
if (r == EOF) { /* premature end of file */
return 1;
} else {
scanf("%*[^\n]%*c"); /* flush pending line */
}
}
#ifdef ONE_IS_PRIME
i = 1; /* start this loop at 1 if you want to assume 1 is prime */
#else
i = (n == 4) ? 2 : 3;
#endif
for (; i <= n / 2; i += 2) {
if (isprime(i) && isprime(n - i)) {
printf("%llu = %llu + %llu\n", n, i, n - i);
return 0;
}
}
printf("Goldbach was wrong!\n"
" %llu cannot be written as the sum of two primes\n", n);
return 0;
}发布于 2014-02-24 19:40:22
你可以认为1是素数,因为Goldbach在给Leonhard Euler.But的信中也认为它是素数,也就是1被认为是prime.Later的时候,它被放弃了,因此这是Goldbach的第三次修正的conjecture.Also,因为今天我们认为1既不是素数,也不是复合的,即使你不认为1是素数,这个猜想仍然成立,直到4*10^18 (重新验证到4*10^17)。
就你和教授打交道而言,你最好问问他想要什么。
https://stackoverflow.com/questions/19891404
复制相似问题