编写C程序:输入两数生成范围、验证正数及统计素数与合数
我来帮你搞定这个C程序,完全实现你要的功能:让用户输入两个正整数,先验证合法性,再生成区间序列,最后统计素数、合数的列表和数量。先上完整代码,再给你拆解细节:
完整实现代码
#include <stdio.h> #include <stdbool.h> // 判断一个数是否为素数的函数 bool isPrime(int num) { if (num <= 1) { return false; // 1及以下不是素数 } for (int i = 2; i * i <= num; i++) { if (num % i == 0) { return false; } } return true; } int main() { int num1, num2, start, end; // 提示用户输入两个正整数 printf("请输入两个正整数(用于生成区间序列):\n"); scanf("%d %d", &num1, &num2); // 验证输入是否为正数 if (num1 <= 0 || num2 <= 0) { printf("错误:请输入大于0的正整数!\n"); return 1; } // 确定区间的起始和结束值(处理第一个数大于第二个数的情况) start = (num1 < num2) ? num1 : num2; end = (num1 > num2) ? num1 : num2; // 生成并输出区间序列 printf("生成的区间序列:"); for (int i = start; i <= end; i++) { printf("%d", i); if (i != end) { printf(", "); } } printf("\n"); // 初始化统计变量 int primeCount = 0, compositeCount = 0; int primes[1000], composites[1000]; // 假设区间长度不超过1000,可按需调整 // 遍历区间,分类素数和合数 for (int i = start; i <= end; i++) { if (i == 1) { continue; // 1既不是素数也不是合数,跳过统计 } if (isPrime(i)) { primes[primeCount++] = i; } else { composites[compositeCount++] = i; } } // 输出素数统计结果 printf("\n素数列表(共%d个):", primeCount); for (int i = 0; i < primeCount; i++) { printf("%d", primes[i]); if (i != primeCount - 1) { printf(", "); } } printf("\n"); // 输出合数统计结果 printf("合数列表(共%d个):", compositeCount); for (int i = 0; i < compositeCount; i++) { printf("%d", composites[i]); if (i != compositeCount - 1) { printf(", "); } } printf("\n"); // 特殊说明1的情况 if (start <= 1 && end >= 1) { printf("\n注意:数字1既不是素数也不是合数\n"); } return 0; }
代码细节拆解
1. 输入合法性验证
- 首先检查用户输入的两个数是否都大于0,如果有任意一个非正,直接输出错误并退出程序
- 额外处理了用户输入的第一个数大于第二个数的情况(比如输入10和1),自动交换确定区间的起始和结束,保证序列是从小到大的
2. 素数判断函数
isPrime函数负责判断一个数是否为素数:- 小于等于1的数直接返回
false - 从2遍历到该数的平方根(这样比遍历到num-1更高效),如果能被整除就不是素数
- 遍历结束没找到因数,就返回
true说明是素数
- 小于等于1的数直接返回
3. 统计与输出
- 用两个数组分别存储素数和合数,同时用计数器记录数量
- 特别注意数字1的处理:它既不属于素数也不属于合数,所以遍历的时候直接跳过它
- 最后分别输出素数、合数的列表和数量,如果区间包含1,还会给出特殊说明
看你之前写了部分输入相关的代码,我把它整合到了完整逻辑里,还修正了提示文字的表述,让用户更容易理解要输入什么~
内容的提问来源于stack exchange,提问作者Francisco P.
相关产品推荐
相关产品推荐

