编写思想:对100到200之间的数依次进行for循环判断,看其是否为素数。判断方法:对于一个自然数,除了1以外,不是素数就是合数。若该数字是素数,则不能被除了1和它自身以外的数整除;而一个数如果是合数,则它的所有因子不会大于对其开根号所得出的数,由此可得出每个数最多时候的循环次数。
初次生成的源代码如下:
#include<stdio.h> #include<math.h> int main() { int primer,variabe,sign; for(primer=101;primer<201;primer++) { for(variabe=2;variabe<=sqrt(primer);variabe++) { sign=0; if(primer%variabe==0) break; else sign=1; } if(sign==1) printf("%-5d",primer); } return 0; }
运行结果如下:
101 103 107 109 113 127 131 137 139 149 151 157 163 167
173 179 181 191 193 197 199
由于以上程序产生了一些不必要的循环,增加了程序的时间复杂度,故而对其进行了改进。
改进1:去掉了标志变量sign,减少了内存的占用;
改进2:由于找的是100到200之间的素数,因此其间的偶数均不必进行判断,故而只剩下奇数,又由于奇数肯定无法被偶数整除,故而去掉variable中的偶数循环,降低了程序的时间复杂度。
改进后的代码如下:
#include<stdio.h> #include<math.h> int main() { int primer,variabe; for(primer=101;primer<201;primer+=2) { for(variabe=3;variabe<=sqrt(primer);variabe+=2) { if(primer%variabe==0) break; } if(variabe>sqrt(primer)) printf("%-5d",primer); } return 0; }
运行结果同上一致:
101 103 107 109 113 127 131 137 139 149 151 157 163 167
173 179 181 191 193 197 199
时间: 2024-10-10 08:52:48