//问题:计算100-200之间的素数
//素数:指除了 1 和它本身以外,不能被任何整数整除的数,例如17就是素数,因为它不能被 2~16 的任一整数整除。
思路1: 判断一个整数 i 是否是素数,只需把 i 被 2 ~ i-1 之间的每一个整数去除,如果都不能被整除,那么 i 就是一个素数。
思路2: i 不必被 2 ~ i-1 之间的每一个整数去除,只需被 2 ~ i \sqrt i i 之间的每一个整数去除就可以了。如果 i 不能被 2 ~ i \sqrt i i 之间任一整数整除,i 必定是素数。除此我们知道偶数一定不是素数,去除所求范围中的偶数程序运行效率会更加提高。
9 -> 3*3
12 -> 2*6 或 3*4
15 -> 3*5
16 -> 2*8 或 4*4
解释:随意列举一些非素数,就会发现这些数的因子(除去1)至少存在一个小于等于其自身开平方(sqrt())
//思路 1:
#include <stdio.h>
int main(void){
int i, j, count = 0;
for (i = 100; i <= 200; i++){ // i 从 100 -> 200递增
for (j = 2; j < i; j++){ // 判断 i 能否被 [2,i-1] 之间任一数整除
if (i%j == 0) break; // 一旦i能被整除则立即跳出循环
}
if (j == i) {
printf("%d ", i); // 若i为素数,则j最终的结果一定等于 j+1 = i
count++; // 计算素数的个数
}
}
printf("共%d个素数\n", count);
return 0;
}
//思路 2:
#include <stdio.h>
#include <math.h>
int main(){
int i = 101, j, count = 0; //直接从 i = 101开始,注意j为int类型
for (; i <= 200; i += 2){ //i += 2,排除[100,200]之间偶数
/*取i中间值。也可以使用 i/2 ……
只需要判断在 [3,(int)sqrt(i)] 无法被整数就说明是素数
*/
for (j = 3; j <= sqrt(i); j++){
if (i % j == 0) break; //能否被整除
}
if (j > sqrt(i)) { //sqrt(i)类型为double
printf("%d ", i);
count++; //计数器
}
}
printf("共%d个素数\n", count);
return 0;
}
提示:本文为我个人学习笔记,皆纯手爪书写,如有错误请指教,转载请注明出处。