首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >2值之间的孪生素数错误的结果

2值之间的孪生素数错误的结果
EN

Stack Overflow用户
提问于 2015-02-12 03:06:25
回答 3查看 278关注 0票数 1

我一直在编写这个程序来计算两个值之间有多少个孪生素数,并且指定了孪生素数的格式为(6n-1,6n+1),但(3,5)除外。我的代码似乎工作得很好,但它总是给我错误的结果……比我应该得到的少了两个孪生素数。在1和40之间,我们应该有5个孪生素数,但我总是得到4。

我做错了什么?我没有考虑到(3,5)吗?

下面是我的代码:

代码语言:javascript
运行
复制
#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;
}
EN

回答 3

Stack Overflow用户

发布于 2015-02-12 03:31:15

你的程序没有命中(3,5),因为3不是质数,也因为4不是6的倍数,而不是主循环单步执行6,这个答案是单步执行1。

代码语言:javascript
运行
复制
#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;
}

程序输出

代码语言:javascript
运行
复制
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

下一次运行:

代码语言:javascript
运行
复制
3
10
THIS IS THE LOW  3
 AND THIS IS THE HIGH 10
 3  5
 5  7
Number of twin primes is 2
票数 1
EN

Stack Overflow用户

发布于 2015-02-12 03:51:45

https://primes.utm.edu/lists/small/100ktwins.txt

40以下的五个孪生素数是(3,5),(5,7),(11,13),(17,19),(29,31),所以如果你知道你的代码没有计算(3,5),那么它工作正常,计数(5,7),(11,13),(17,19)和(29,31)。

一个可能的解决方法是添加一个if语句,如果开始的数字小于4,它会将1加到"count“上。我不太习惯阅读C语法,所以我很难理解你的公式,抱歉。

编辑:由于注释不会格式化代码片段:

i = low; count = 0; if (low <= 3 && high >= 3){ count ++; // accounts for (3,5) twin primes if the range includes 3 }

票数 0
EN

Stack Overflow用户

发布于 2015-02-12 04:16:48

你的素数函数有问题,这是你的素数函数前十个素数求值的输出

代码语言:javascript
运行
复制
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的素数,与另一个素数相差2。

例如(3,5),(5,7),(11,13)。格式(6n-1,6n+1)是真的,但对于你所说的(3,5)。你的程序运行的很好,因为它显示了在区间中的孪生质数的数量,并且遵循上面提到的规则。这不包括(3,5)。您可以设置一种例外(例如,如果low<=3在总数上加1),或者使用另一种算法来计算孪生素数(例如,验证i是否为素数,然后计算从i到下一个素数的距离,如果为distance=2,则它们是孪生素数)

1

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28462441

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档