用 C 语言检查一个数是否为质数

CBeginner
立即练习

简介

在这个实验中,我们将学习如何在 C 编程中检查一个数是否为质数。该实验包括三个步骤:从用户读取一个整数输入,测试从 2 到该数平方根的可除性,以及打印该数是否为质数。在本实验结束时,你将拥有一个可以确定给定整数是否为质数的可运行程序。

该实验首先教授如何使用scanf()函数从用户读取整数输入。然后,它介绍了质数检查算法,该算法涉及测试从 2 到输入数平方根的可除性。如果没有找到除数,则该数被认为是质数。最后,程序打印结果,表明该数是否为质数。

读取一个整数

在这一步中,我们将学习如何在 C 编程中从用户读取整数输入。这是创建质数检查器的第一步。

首先,让我们为我们的质数检查程序创建一个新的 C 文件:

cd ~/project
nano prime_checker.c

现在,让我们编写读取整数的代码:

#include <stdio.h>

int main() {
    int number;

    printf("输入一个正整数,以检查它是否为质数:");
    scanf("%d", &number);

    printf("你输入的是:%d\n", number);

    return 0;
}

示例输出:

输入一个正整数,以检查它是否为质数:17
你输入的是:17

让我们来分析一下这段代码:

  • #include <stdio.h> 包含标准输入/输出库
  • int main() 是程序执行开始的主函数
  • int number; 声明一个整数变量来存储用户输入
  • printf() 向用户显示一个提示
  • scanf() 从用户读取一个整数输入并将其存储在 number
  • printf() 确认用户输入的数字

编译并运行程序:

gcc prime_checker.c -o prime_checker
./prime_checker

测试从 2 到 √n 的可除性

在这一步中,我们将通过测试从 2 到输入数字的平方根的可除性来实现质数检查算法。

让我们修改之前的 C 程序,添加质数检查逻辑:

nano ~/project/prime_checker.c

用可除性测试更新代码:

#include <stdio.h>
#include <math.h>

int is_prime(int number) {
    // 小于 2 的数字不是质数
    if (number < 2) {
        return 0;
    }

    // 检查从 2 到数字平方根的可除性
    for (int i = 2; i <= sqrt(number); i++) {
        if (number % i == 0) {
            return 0; // 如果可除,则不是质数
        }
    }

    return 1; // 如果没有找到除数,则是质数
}

int main() {
    int number;

    printf("输入一个正整数,以检查它是否为质数:");
    scanf("%d", &number);

    if (is_prime(number)) {
        printf("%d 是一个质数。\n", number);
    } else {
        printf("%d 不是一个质数。\n", number);
    }

    return 0;
}

使用数学库编译程序:

gcc ~/project/prime_checker.c -o ~/project/prime_checker -lm

示例输出:

输入一个正整数,以检查它是否为质数:17
17 是一个质数。

输入一个正整数,以检查它是否为质数:20
20 不是一个质数。

实现的关键点:

  • <math.h> 中的 sqrt() 函数计算平方根
  • 我们只检查到 √n 的可除性以优化算法
  • 如果没有找到除数,则该数字是质数
  • 取模运算符 % 检查可除性
  • 非质数返回 0,质数返回 1

打印是否为质数

在这最后一步中,我们将通过添加更详细的输出并允许进行多个数字检查来增强我们的质数检查程序。

让我们修改程序以提供更全面的输出:

nano ~/project/prime_checker.c

用改进的界面更新代码:

#include <stdio.h>
#include <math.h>

int is_prime(int number) {
    // 小于 2 的数字不是质数
    if (number < 2) {
        return 0;
    }

    // 检查从 2 到数字平方根的可除性
    for (int i = 2; i <= sqrt(number); i++) {
        if (number % i == 0) {
            return 0; // 如果可除,则不是质数
        }
    }

    return 1; // 如果没有找到除数,则是质数
}

void print_prime_details(int number) {
    if (is_prime(number)) {
        printf("%d 是一个质数!\n", number);
        printf("解释:\n");
        printf("- 它只能被 1 和它本身整除\n");
        printf("- 在 2 和√%d之间没有找到其他除数\n", number);
    } else {
        printf("%d 不是一个质数。\n", number);

        // 找到并打印最小的除数
        for (int i = 2; i <= sqrt(number); i++) {
            if (number % i == 0) {
                printf("解释:\n");
                printf("- 能被 %d 整除\n", i);
                printf("- %d × %d = %d\n", i, number/i, number);
                break;
            }
        }
    }
}

int main() {
    int number, continue_check;

    do {
        printf("输入一个正整数,以检查它是否为质数:");
        scanf("%d", &number);

        print_prime_details(number);

        printf("\n你想检查另一个数字吗?(1=是,0=否):");
        scanf("%d", &continue_check);
    } while (continue_check == 1);

    printf("感谢你使用质数检查器!\n");

    return 0;
}

编译程序:

gcc ~/project/prime_checker.c -o ~/project/prime_checker -lm

示例输出:

输入一个正整数,以检查它是否为质数:17
17 是一个质数!
解释:
- 它只能被1和它本身整除
- 在2和√17之间没有找到其他除数

你想检查另一个数字吗?(1=是,0=否):1

输入一个正整数,以检查它是否为质数:20
20 不是一个质数。
解释:
- 能被2整除
- 2 × 10 = 20

你想检查另一个数字吗?(1=是,0=否):0
感谢你使用质数检查器!

主要改进:

  • 为质数和非质数添加了详细解释
  • 实现了一个循环以允许进行多个数字检查
  • 提供了更多关于数字属性的有教育意义的输出

总结

在这个实验中,我们学习了如何在 C 编程中从用户读取整数输入,这是创建质数检查器的第一步。然后,我们通过测试从 2 到输入数字的平方根的可除性来实现质数检查算法。该程序通过遍历从 2 到该数字的平方根的数字,并检查其中是否有任何数字能整除该数字,来检查给定的数字是否为质数。如果没有找到除数,则该数字被认为是质数。