1、实验目的
素数判断的算法设计分析与对比.
2、实验具体要求
输出所有小于等于n(n为一个大于2的正整数,比如100)的素数,要求:
- 每行输出10个素数;
- 尽可能采用较优算法。
3、实验设计思路(编程语言、模块划分及函数功能描述等)
选择C语言作为编程语言。
模块划分及函数功能描述:
主函数模块 (main函数中)
负责程序的入口,读取用户输入的正整数n,调用其他模块的函数来找出并打印小于等于n的所有素数。
素数检查模块 (is_prime.c或相关函数)
包含一个或多个函数,用于检查给定的整数是否为素数。
函数功能描述
main函数
初始化变量,如n(用户输入的正整数)和count(用于计数已找到的素数数量)。使用printf函数提示用户输入一个正整数。使用scanf函数读取用户输入的n。调用is_prime函数(或类似函数)来检查从2到n的每个整数是否为素数。对于每个素数,使用printf函数打印出来,并增加count计数器的值。当count是10的倍数时,输出一个换行符,以便每行打印10个素数。在循环结束后,如果最后一行打印的素数不足10个,输出一个额外的换行符以保持格式整洁。
is_prime函数
接收一个整数num作为参数。
如果num小于等于1,返回 false(或 0,具体取决于函数返回类型)。
如果num是2或3,返回 true(或 1)。
如果num能被2或3整除,返回 false。
使用一个循环,从5开始,每次增加6(检查形如6k±1的数,其中k是自然数),直到i * i大于num。在循环中,检查num是否能被i或i+2整除。
如果在循环中找到了任何能整除num的数,返回false。
如果循环结束都没有找到能整除num的数,返回true。
(3).实验流程:
<1>编写main函数,初始化变量并提示用户输入。
<2>编写is_prime函数来检查素数。
<3>在main函数中调用is_prime函数来查找并打印素数。
<4>编译并运行程序,测试不同的输入值,确保程序按预期工作。
<5>如有需要,进行代码调试和优化,提高程序的效率和健壮性。
4、实验源程序、程序调试结果
源程序:
#include <stdio.h>
#include <stdbool.h>
// 函数声明
bool isPrime(int num);
int main() {
int n, count = 0;
printf("Enter a positive integer greater than 2: ");
scanf("%d", &n);
printf("Prime numbers less than or equal to %d are:\n", n);
for (int i = 2; i <= n; ++i) {
if (isPrime(i)) {
printf("%d ", i);
++count;
// 如果已经输出了10个素数,则换行
if (count % 10 == 0) {
printf("\n");
}
}
}
// 如果最后一行素数不足10个,则换行
if (count % 10 != 0) {
printf("\n");
}
return 0;
}
// 函数定义:检查一个数是否为素数
bool isPrime(int num) {
if (num <= 1) {
return false;
}
if (num <= 3) {
return true;
}
if (num % 2 == 0 || num % 3 == 0) {
return false;
}
// 只检查到sqrt(num)即可
for (int i = 5; i * i <= num; i += 6) {
if (num % i == 0 || num % (i + 2) == 0) {
return false;
}
}
return true;
}
调式结果:
5.程序调试过程中遇到的问题及解决办法
问题:如果用户输入的不是一个整数或者是一个负数,程序可能不会按照预期工作。
解决方法:可以添加额外的输入验证来确保用户输入的是一个正整数。这可以通过使用scanf的返回值和getchar函数来读取并丢弃额外的非数字字符来实现。
6、实验收获与体会
加深了对素数概念的理解:通过实现素数检查算法,我更加深入地理解了素数的定义和性质。
熟悉了C语言的基本语法和库函数:我使用了printf、scanf、sqrt等函数,并熟悉了C语言中的循环和条件语句。
了解了优化策略:通过实现只检查到sqrt(i)的优化,我了解了在编程中优化性能的重要性。
提高了跨平台意识:我意识到使用特定于平台的函数(如system("pause"))可能会限制程序的可移植性。