C语言求给定范围内的所有素数
问题描述
求给定范围start〜end之间的所有素数。问题分析
判定一个整数m是否为素数的关键就是要判定整数m能否被除1和它自身以外的任何其他整数所整除,若都不能整除,则m即为素数。本题求的是给定范围start〜end之间的所有素数,考虑到程序的通用性,需要从键盘上输入start和end值,例如输入start=1,end=1000,则所编写的程序应能够打印出1〜1000之间的所有素数。
算法设计
由问题分析可知,该问题考虑用双层循环结构实现。外层循环对start〜end之间的每个数进行迭代,逐一检查其是否为素数。外层循环的循环变量用变量m表示,m即代表当前需要进行判断的整数,显然其取值范围为start≤m≤end。
内层循环稍显复杂,完成的功能是判断当前的m是否为素数。设内循环变量为m,程序设计时i从2开始,直到





可以使用标志位flag来监控内外循环执行的情况。在定义变量时将flag初值设为1,在内层循环中判断时,如果m能够被


还需要注意的是,在外循环中,每次要进行下一次迭代之前,要先将flag标志再次置为1。
程序流程图:

下面是完整的代码:
#include<stdio.h> #include<math.h> int main() { int start, end, i, k, m, flag=1, h=0; do { printf("Input START and END:"); scanf("%d%d", &start, &end); }while(!(start>0 && start<end)); printf("......... prime table(%d-%d).........\n", start, end); for(m=start; m<=end; m++) { k=sqrt(m); for(i=2; i<=k; i++) if(m%i==0) { flag=0; break; } if(flag) { printf("%-4d",m); h++; if(h%10==0) printf("\n"); } flag=1; } printf("\nThe total is %d", h); return 0; }运行结果:
Input START and END:1 100 ......... prime table(1-100)......... 1 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97