赞
踩
// 暴力遍历法 int main() { int n = 0; int count = 0; scanf("%d", &n); for (int i = 2; i <= n; i++) { int sign = 1; for (int j = 2; j < i; j++) { if (i % j == 0) { sign = 0; break; } } if (sign == 1) { printf("%d ", i); count++; if (count % 5 == 0) { printf("\n"); } } } return 0; }
#include< // 折半范围遍历 int main() { int n = 0; scanf("%d", &n); int count = 0; for (int i = 2; i <= n; i++) { int sign = 1; for (int j = 2; j <= i / 2; j++) { if (i % j == 0) { sign = 0; break; } } if (sign == 1) { printf("%d\t", i); count++; if (count % 5 == 0) { printf("\n"); } } } return 0; }
同样是在第一个算法的基础上改进的
请看下面的图示:
仔细观察图示,有没有发现,我们求他们的平方根看看,结果:
发现在它们的平方范围内,都会有可以被整除的数值,(当然我们这里不是素数的数值)逆向思考:不是的不就是素数了吗?
这样我们再次缩小了遍历的范围了,在第一种算法的基础上减了,一个根号范围;
查找的时间复杂度为 O(根号n )
#include<stdio.h> #include<math.h> // 根号范围遍历 int main() { int n = 0; int count = 0; scanf("%d", &n); for (int i = 2; i <= n; i++) { int sign = 1; for (int j = 2; j <= (int)sqrt(i); j++) // sqrt 求平方根的函数,返回 // 值是 double ,所以这里强转一下 { if (i % j == 0) { sign = 0; break; } } if (sign == 1) { printf("%d\t", i); count++; if (count % 5 == 0) { printf("\n"); } } } return 0; }
与其把时间花在争论上,不如多花些点时间提高自己?
让那些不懂你的人望尘莫及,有些话不说,有些事不争人生就是个不断成熟的过程。
等你真正得到境界的提升,你就会发现,与你志同道合的人越来越多,不说不争,也能找到中窝
———— 一禅心灵庙语
限于自身水平有限,其中存在的错误希望大家给予指教,谢谢大家,韩信点兵——多多益善!,后会有期,江湖再见!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。