标签: ,

实训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’);

}

}

}

国开题库网客服联系方式

国开题库网客服联系方式