c语言求一个区间里的所有素数
需要的材料:window10系统,一个可以正常使用的编译器(博主我用的是notepad++)。
素数的定义:素数又称质数。所谓素数是指除了 1 和它本身以外,不能被任何整数整除的数。
运用的原理和方法:判断一个整数m是否是素数,只需把 m 被 2 ~ m-1 之间的每一个整数去除,如果都不能被整除,那么 m 就是一个素数。
c语言的源代码如下:
#include <stdio.h>
void main(){
int a;//用户输入区间的最小值
int b;//用户输入区间的最大值
int i;
int n;
//这里是判断用户输入的情况
printf("请输入区间的最小值(必须是大于1整数):");
scanf("%d",&a);
if(a<=1){
printf("请输入大于1数\n");
return ;
}
printf("\n输入区间最大值:");
scanf("%d",&b);
if(b<=1)
{
printf("请输入大于1的数\n");
return;
}
if(a>=b){
printf("区间输入错误请重新输入");
return;
}
//---------------------------
//导入主要的计算,这里运用到了for循环和if的判断语句
for(n=a;n<=b;n++)
{
if(n>1)
{
for(i=2;i<n;i++)
{
if(n%i==0)
break;
}
if(i==n)
/*根据原理可以知道,如果少了这个判断的话,打印出来的结果里面会出现9,但是9不是素数。*/
{ //故此我们需要先判断再打印结果
printf("%d ",n);
}
}
}
//return 0; //这里不需要返回一个0值
}
利用window操作系统下的dos输入的结果如下:
后续优化
看了评论有说写的不对的。哈哈哈,确实有点不合理。
当年我还是个菜鸟时候写的,最新代码参考下面的。
环境:C(GCC 9.2.0)
#include <stdio.h>
#include <stdbool.h>
#include <math.h>
// 素数检测
bool isPrimeNumber(int number) {
if (number <= 1) return false;
if (number <= 3) return true;
if (number % 2 == 0 || number % 3 == 0) return false;
for (int i = 5; i * i <= number; i += 6) {
if (number % i == 0 || number % (i + 2) == 0) return false;
}
return true;
}
// 主函数,处理输入并展示指定区间内的素数
int main() {
int minBound, maxBound;
printf("请输入区间的最小值(必须大于1的整数): ");
scanf("%d", &minBound);
// 确保最小值有效
while (minBound <= 1) {
printf("输入值需大于1,请重新输入: ");
scanf("%d", &minBound);
}
printf("请输入区间的最大值: ");
scanf("%d", &maxBound);
// 确保最大值有效且大于最小值
while (maxBound <= minBound) {
if (maxBound <= 1) {
printf("最大值需大于1,请重新输入: ");
} else {
printf("最大值需大于最小值,请重新输入: ");
}
scanf("%d", &maxBound);
}
printf("区间[%d, %d]内的素数有: ", minBound, maxBound);
// 遍历区间,检查并打印素数
for (int currentNum = minBound; currentNum <= maxBound; currentNum++) {
if (isPrimeNumber(currentNum)) {
printf("%d ", currentNum);
}
}
printf("\n");
return 0;
}
学弟学妹,参考即可。做作业照抄这段的话,老师可能知道这是CV的。
这段代码是求不了特别大范围的区间内的素数,
采用了类似埃拉托斯特尼筛法的算法 ,不知道原理内容可以参考这个视频中的(视频不是我拍摄的,百度出来的) 素性检验之区间分段筛segmented sieve
注意:C语言中的int类型在不同平台上大小可能不同,通常为32位或64位。32位系统上的int最大值约为21亿(2^31 - 1),而64位系统上大约为9 quintillion(2^63 - 1)。如果区间的端点超过这些界限,会导致整数溢出,从而产生错误的结果。
感谢阅读。。。。