我一直在研究这个程序来计算两个值之间有多少孪生素数,并且已经指定孪生素数以(6n-1,6n + 1)格式出现,但(3,5)除外。我的代码似乎工作正常,但它一直给我错误的结果....少了几个孪生素数比我应该得到的。在1到40之间,我们应该有5个孪生素数,但我总是得到4.é
我做错了什么?我不考虑(3,5)?
这是我的代码:
#include <stdio.h>
int prime (int num) {
int div;
if (num == 2) return 1;
if (num % 2 == 0) return 0;
div = 3;
while (div*div <= num && num%div != 0)
div = div + 2;
if (num%div == 0)
return 0;
else
return 1;
}
int main(void) {
int low, high, i, count, n, m;
printf("Please enter the values for the lower and upper limits of the interval\n");
scanf("%d%d", &low, &high);
printf("THIS IS THE LOW %d\n AND THIS IS THE HIGH %d\n", low, high);
i = low;
count = 0;
while (6*i-1>=low && 6*i+1<=high) {
n = 6*i-1;
m = 6*i+1;
if (prime(n) && prime(m)) ++count;
i = i + 1;
}
printf("Number of twin primes is %d\n", count);
return 0;
}
答案 0 :(得分:1)
你的程序错过了(3 5),因为3没有被困成素数,因为4不是6的倍数。而不是主循环步进(有效)6,这个答案逐步为1。
#include <stdio.h>
int prime (int num) {
int div;
if (num == 1) return 0; // excluded 1
if (num == 2 || num == 3) return 1; // included 3 too
if (num % 2 == 0) return 0;
div = 3;
while (div*div <= num) {
if (num % div == 0) // moved to within loop
return 0;
div += 2;
}
return 1;
}
int main(void) {
int low, high, i, count, n, m;
printf("Please enter the values for the lower and upper limits of the interval\n");
scanf("%d%d", &low, &high);
printf("THIS IS THE LOW %d\n AND THIS IS THE HIGH %d\n", low, high);
count = 0;
for (i=low; i<=high; i++) {
n = i-1;
m = i+1;
if (prime(n) && prime(m)) {
printf ("%2d %2d\n", n, m);
++count;
}
}
printf("Number of twin primes is %d\n", count);
return 0;
}
节目输出
1
40
THIS IS THE LOW 1
AND THIS IS THE HIGH 40
3 5
5 7
11 13
17 19
29 31
Number of twin primes is 5
下次运行:
3
10
THIS IS THE LOW 3
AND THIS IS THE HIGH 10
3 5
5 7
Number of twin primes is 2
答案 1 :(得分:0)
https://primes.utm.edu/lists/small/100ktwins.txt
四十岁以下的五个孪生素数是(3,5),(5,7),(11,13),(17,19),(29,31)所以如果你知道你的代码不是&#39; t计数(3,5)然后它正常工作,计数(5,7),(11,13),(17,19)和(29,31)。
一个可能的解决方法是添加一个if语句,它将1加到&#34; count&#34;如果起始数小于4.我真的不习惯读C语法,所以我很难理解你的公式,对不起。
编辑:因为评论不会格式化代码段:
i = low;
count = 0;
if (low <= 3 && high >= 3){
count ++; // accounts for (3,5) twin primes if the range includes 3
}
答案 2 :(得分:0)
你的素数函数有问题,这是前10个主要评价的素数函数的输出
for(i=1;i<=10;i++) printf("%d\t%d",i,prime(i));
1 1
2 1
3 0
4 0
5 1
6 0
7 1
8 0
注意Weather Vane的prime()函数,你应该将3包括为素数(并排除1)。
从[1]开始,孪生素数是两个素数差距为2,与另一个素数相差两个。
实例是(3,5),(5,7),(11,13)。格式(6n-1,6n + 1)是正确的,但对于(3,5),如你所述。你的程序几乎没有运行,因为它显示了区间内的双素数的数量并遵循上述规则。这不包括(3,5)。你可以做一种异常(比如低= = 3加1总计数),或使用另一种算法计算孪生素数(如验证我是否是素数,然后计算从i到下一个素数的距离,如果距离= 2然后他们是孪生素数)