实训3 素数判断程序
任务描述:编写C程序,判断用户输入的整数是否为素数(质数),并查找指定范围内的所有素数。
学习目标:掌握循环结构(如for、while)和条件判断的嵌套应用。
任务要求:
Ø 输入任意整数(需验证输入有效性);
Ø 输出判断结果(”是素数”或”不是素数”等);
Ø 优化算法效率(如仅检查到平方根)。
段落1
#include <stdio.h>
#include <math.h> // 用于sqrt函数(计算平方根)
// 函数声明:判断一个整数是否为素数
int isPrime(int n);
// 函数声明:获取有效的整数输入
int getValidInt();
// 函数声明:获取有效的范围输入(起始值和结束值)
void getValidRange(int *start, int *end);
int main() {
int choice;
do {
// 显示功能菜单
printf(“\n===== 素数判断程序 =====\n”);
printf(“1. 判断单个整数是否为素数\n”);
printf(“2. 查找指定范围内的所有素数\n”);
printf(“0. 退出程序\n”);
printf(“请选择操作(0-2):”);
// 验证菜单选择输入有效性
if (scanf(“%d”, &choice) != 1) {
printf(“输入无效!请输入数字0-2。\n”);
// 清除输入缓冲区的错误内容
while (getchar() != ‘\n’);
continue;
}
// 清除输入缓冲区剩余字符
while (getchar() != ‘\n’);
// 根据选择执行对应功能
switch (choice) {
case 1: {
// 单个素数判断
int num = getValidInt();
if (isPrime(num)) {
printf(“%d 是素数\n”, num);
} else {
printf(“%d 不是素数\n”, num);
}
break;
}
case 2: {
// 范围素数查找
int start, end;
getValidRange(&start, &end);
printf(“范围 %d 到 %d 内的素数有:\n”, start, end);
int count = 0; // 用于控制输出格式(每5个换一行)
for (int i = start; i <= end; i++) {
if (isPrime(i)) {
printf(“%d\t”, i);
count++;
if (count % 5 == 0) { // 每输出5个素数换行
printf(“\n”);
}
}
}
if (count == 0) {
printf(“该范围内没有素数\n”);
} else {
printf(“\n”); // 最后补一行,保证格式整洁
}
break;
}
case 0:
printf(“程序已退出,谢谢使用!\n”);
break;
default:
printf(“无效选择!请输入0-2。\n”);
}
} while (choice != 0); // 选择0时退出循环
return 0;
}
段落2
// 函数定义:判断n是否为素数(返回1为素数,0为非素数)
int isPrime(int n) {
// 素数定义:大于1的自然数,且除了1和自身无其他因数
if (n <= 1) {
return 0; // 小于等于1的数不是素数
}
if (n == 2) {
return 1; // 2是唯一的偶素数
}
if (n % 2 == 0) {
return 0; // 偶数(除2外)不是素数
}
// 优化算法:仅需检查到sqrt(n),且只检查奇数(减少一半循环次数)
for (int i = 3; i <= sqrt(n); i += 2) {
if (n % i == 0) { // 存在其他因数,不是素数
return 0;
}
}
return 1; // 未找到其他因数,是素数
}
// 函数定义:获取有效的整数输入(处理非整数输入)
int getValidInt() {
int num;
while (1) {
printf(“请输入一个整数:”);
if (scanf(“%d”, &num) == 1) { // 输入为整数时有效
// 清除输入缓冲区剩余字符,避免影响后续输入
while (getchar() != ‘\n’);
return num;
} else {
printf(“输入无效!请重新输入整数。\n”);
// 清除输入缓冲区的错误内容
while (getchar() != ‘\n’);
}
}
}
// 函数定义:获取有效的范围输入(起始值<=结束值,且起始值>=2)
void getValidRange(int *start, int *end) {
while (1) {
printf(“请输入范围的起始整数和结束整数(用空格分隔):”);
if (scanf(“%d %d”, start, end) == 2 && *start <= *end && *start >= 2) {
// 输入为两个有效整数,且范围合理
while (getchar() != ‘\n’);
return;
} else {
printf(“输入无效!请确保输入两个整数,且起始值<=结束值、起始值>=2。\n”);
while (getchar() != ‘\n’);
}
}
}

