📌  相关文章
📜  给定范围L至R的双素数计数(1)

📅  最后修改于: 2023-12-03 14:56:55.013000             🧑  作者: Mango

给定范围L至R的双素数计数

程序介绍

本程序实现了给定一个区间 L 至 R,求出该区间内的双素数数量的功能。所谓双素数,指的是两个相邻的质数之差恰好为 2。

程序将输入的区间每个数都逐一判定是否为质数,同时检查其前一个数和后一个数是否均为质数。如果是,则计数器加 1。最后输出计数器的值即为双素数数量。

该程序采用了标准的素数筛法进行质数的筛选,时间复杂度为 O(RloglogR)。在实际测试中,可以较快地得到结果。

使用方法
  1. 下载该程序的代码。

  2. 将代码编译成可执行文件。

    $ gcc count_twins.c -o count_twins
    
  3. 运行该可执行文件,并输入 L 和 R。

    $ ./count_twins
    Please input two integers L and R:
    100 200
    
  4. 程序将输出给定区间内的双素数数量。

    The number of twin primes between 100 and 200 is 2.
    
代码实现

以下代码可以放入文件 count_twins.c 中,进行编译和运行。代码中已经加入了必要的注释以便理解。

#include <stdio.h>
#include <stdbool.h>

// 判断一个数是否为质数
bool is_prime(int num)
{
    if (num < 2) { return false; } // 去除小于 2 的数
    for (int i = 2; i * i <= num; i++) // 记得优化循环条件以减少时间
    {
        if (num % i == 0) { return false; } // 如果存在一个因子,即非质数
    }
    return true; // 没有因子,是质数
}

int main()
{
    int L, R, count = 0; // 定义区间 L,R 和计数器
    printf("Please input two integers L and R: ");
    scanf("%d %d", &L, &R);
    for (int i = L; i <= R; i++)
    {
        if (is_prime(i) && is_prime(i + 2)) { count++; } // 判断是否为双素数
    }
    printf("The number of twin primes between %d and %d is %d.\n", L, R, count);
    return 0;
}
注意事项
  • 本程序仅用于练手,实际应用时应考虑更为高效的算法。
  • 区间 L 和 R 的范围应当仔细控制,避免输入过大范围导致内存或时间占用过高。
  • C 语言中 bool 类型默认不支持,如需使用应事先定义为 typedef enum {false, true} bool; 或者包含头文件 stdbool.h
  • 实际使用时,应当对输入的 L 和 R 进行合法性检查,避免程序崩溃或错误输出。