《深度剖析算法优化:提升效率与精度的秘诀》
想象一下,你面前有一堆杂乱无章的数据,你需要从中找到特定的信息,或者按照一定的规则对这些数据进行排序。又或者,你要为一个物流公司规划最佳的配送路线,以降低成本和提高效率。这些问题看似复杂,但都可以通过特定的算法来解决。算法就像是一把神奇的钥匙,为解决各种各样的问题提供了方法和途径。无论是在科学研究、商业运营还是日常生活中,算法都发挥着不可或缺的作用。
原型—源码
原型
import math
import timedef is_prime(n):for i in range(2, n):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):# 如果找到因子且均为质数,则退出循环if is_prime(p) and is_prime(q):if p * q == n:print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
原型—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
一次优化—源码
任何一个数只需要找其小于开根号的整数即可
import math
import timedef is_prime(n):loop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):# 如果找到因子且均为质数,则退出循环if is_prime(p) and is_prime(q):if p * q == n:print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
一次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
二次优化—源码
跳过小于2的数
import math
import timedef is_prime(n):if n < 2:return Falseloop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):# 如果找到因子且均为质数,则退出循环if is_prime(p) and is_prime(q):if p * q == n:print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
二次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
三次优化—源码
在检查大于2的数时,只检查奇数
import math
import timedef is_prime(n):if n < 2:return Falseif n == 2:return Trueif n % 2 == 0:return Falseloop = int(math.sqrt(n)) + 1for i in range(3, loop, 2):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):# 如果找到因子且均为质数,则退出循环if is_prime(p) and is_prime(q):if p * q == n:print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
三次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
首先排除小于2的数,因为它们不是质数。
-
对于2这个特殊的数,直接返回True。
-
对于偶数(除了2),直接返回False。
-
然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。
-
如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
四次优化—源码
先算乘积
import math
import timedef is_prime(n):for i in range(2, n):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
四次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
五次优化—源码
任何一个数只需要找其小于开根号的整数即可 先算乘积
import math
import timedef is_prime(n):loop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0) if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
五次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
六次优化—源码
跳过小于2的数 先算乘积
import math
import timedef is_prime(n):if n < 2:return Falseloop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0) if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
六次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
首先排除小于2的数,因为它们不是质数。
-
对于2这个特殊的数,直接返回True。
-
对于偶数(除了2),直接返回False。
-
然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。
-
如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
七次优化—源码
在检查大于2的数时,只检查奇数 先算乘积
import math
import timedef is_prime(n):if n < 2:return Falseif n == 2:return Trueif n % 2 == 0:return Falseloop = int(math.sqrt(n)) + 1for i in range(3, loop, 2):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n):for q in range(1, n):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0) if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
七次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
首先排除小于2的数,因为它们不是质数。
-
对于2这个特殊的数,直接返回True。
-
对于偶数(除了2),直接返回False。
-
然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。
-
如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n-1,对于每个数p,再遍历从1到n-1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
八次次优化—源码
p、q循环减半
import math
import timedef is_prime(n):for i in range(2, n):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n // 2 + 1):for q in range(1, n // 2 + 1):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
八次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n//2 + 1,对于每个数p,再遍历从1到n//2 + 1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
九次优化—源码
任何一个数只需要找其小于开根号的整数即可 p、q循环减半
import math
import timedef is_prime(n):loop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n // 2 + 1):for q in range(1, n // 2 + 1):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
九次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n//2 + 1,对于每个数p,再遍历从1到n//2 + 1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
十次优化—源码
跳过小于2的数 p、q循环减半
import math
import timedef is_prime(n):if n < 2:return Falseloop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n // 2 + 1):for q in range(1, n // 2 + 1):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
十次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
首先排除小于2的数,因为它们不是质数。
-
对于2这个特殊的数,直接返回True。
-
对于偶数(除了2),直接返回False。
-
然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。
-
如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n//2 + 1,对于每个数p,再遍历从1到n//2 + 1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq02函数,传入的参数是99460729。
-
优化建议:
-
优化
is_prime函数,只需要检查到sqrt(n)就可以了。 -
对于
prime_pq02函数,可以考虑使用更高效的算法,如试除法结合埃拉托斯特尼筛法来找出质数因子。 -
可以添加更多的错误检查和边界条件处理,例如检查输入的n是否为正整数。
下面是优化后的代码:
import math
import timedef is_prime(n):if n <= 1:return Falseif n == 2:return Trueif n % 2 == 0:return Falseloop = int(math.sqrt(n)) + 1for i in range(3, loop, 2):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(2, int(math.sqrt(n)) + 1):if is_prime(p) and n % p == 0:q = n // pif is_prime(q):print(p, '*', q)end = time.time()print(end - start)returnprint("No prime factors found")if __name__ == '__main__':prime_pq02(99460729)
这个优化后的代码应该会更快地找到99460729的两个质数因子。
十一次优化—源码
在检查大于2的数时,只检查奇数 p、q循环减半
import math
import timedef is_prime(n):if n < 2:return Falseif n == 2:return Trueif n % 2 == 0:return Falseloop = int(math.sqrt(n)) + 1for i in range(3, loop, 2):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(1, n // 2 + 1):for q in range(1, n // 2 + 1):if p * q == n:if is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
十一次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
首先排除小于2的数,因为它们不是质数。
-
对于2这个特殊的数,直接返回True。
-
对于偶数(除了2),直接返回False。
-
然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。
-
如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从1开始,遍历到n//2 + 1,对于每个数p,再遍历从1到n//2 + 1的每个数q。
-
如果p和q都是质数,并且它们的乘积等于n,那么就找到了两个质数因子,打印出来并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
十二次优化—源码
减少p、q循环时间,并对判断p、q为循环优化依次调用
import math
import timedef is_prime(n):for i in range(2, n):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(2, int(math.sqrt(n)) + 1):if n % p == 0:q = n // pif is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
十二次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从2开始,遍历到n的平方根加1,对于每个数p,如果n能被p整除,那么计算q = n // p。
-
然后检查p和q是否都是质数,如果是,则打印出这两个质数因子,并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
十三次优化—源码
任何一个数只需要找其小于开根号的整数即可 减少p、q循环时间,并对判断p、q为循环优化依次调用
import math
import timedef is_prime(n):loop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(2, int(math.sqrt(n)) + 1):if n % p == 0:q = n // pif is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
十三次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
它从2开始,一直检查到n-1,看n是否能被这些数整除。如果能,则n不是质数,返回False;否则,返回True。
-
但这个函数可以优化。例如,只需要检查到sqrt(n)就可以了,因为如果n有一个大于sqrt(n)的因子,那么它必然还有一个小于或等于sqrt(n)的因子。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从2开始,遍历到n的平方根加1,对于每个数p,如果n能被p整除,那么计算q = n // p。
-
然后检查p和q是否都是质数,如果是,则打印出这两个质数因子,并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
十四次优化—源码
跳过小于2的数 减少p、q循环时间,并对判断p、q为循环优化依次调用
import math
import timedef is_prime(n):if n < 2:return Falseloop = int(math.sqrt(n)) + 1for i in range(2, loop):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(2, int(math.sqrt(n)) + 1):if n % p == 0:q = n // pif is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
十四次优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
首先排除小于2的数,因为它们不是质数。
-
对于2这个特殊的数,直接返回True。
-
对于偶数(除了2),直接返回False。
-
然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。
-
如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从2开始,遍历到n的平方根加1,对于每个数p,如果n能被p整除,那么计算q = n // p。
-
然后检查p和q是否都是质数,如果是,则打印出这两个质数因子,并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
最终优化—源码
在检查大于2的数时,只检查奇数 减少p、q循环时间,并对判断p、q为循环优化依次调用
import math
import timedef is_prime(n):if n < 2:return Falseif n == 2:return Trueif n % 2 == 0:return Falseloop = int(math.sqrt(n)) + 1for i in range(3, loop, 2):if n % i == 0:return Falsereturn Truedef prime_pq(n):start = time.time()for p in range(2, int(math.sqrt(n)) + 1):if n % p == 0:q = n // pif is_prime(p) and is_prime(q):print(p, '*', q)end = time.time()print(end - start)exit(0)if __name__ == '__main__':# 9973 * 9973prime_pq(99460729)
最终优化—源码解析
这段代码的目的是找出一个给定数字的两个质数因子。下面是对代码的详细分析:
-
导入模块:
-
math: 这个模块提供了数学函数,但在这个代码中并没有被使用。 -
time: 这个模块被用来测量程序的执行时间。
-
-
is_prime函数:
-
这个函数用于判断一个数是否为质数。
-
首先排除小于2的数,因为它们不是质数。
-
对于2这个特殊的数,直接返回True。
-
对于偶数(除了2),直接返回False。
-
然后从3开始,只检查奇数(因为偶数已经被排除了),直到sqrt(n)。
-
如果在这个范围内找到一个能整除n的数,那么n就不是质数,返回False;否则,返回True。
-
-
prime_pq函数:
-
这个函数用于找出一个数的两个质数因子。
-
它从2开始,遍历到n的平方根加1,对于每个数p,如果n能被p整除,那么计算q = n // p。
-
然后检查p和q是否都是质数,如果是,则打印出这两个质数因子,并结束程序。
-
这个函数的时间复杂度是O(n^2),因为它有两个嵌套的循环。对于大的n,这可能会非常慢。
-
-
主程序:
-
在主程序中,调用了prime_pq函数,传入的参数是99460729。
-
高阶优化
思路:
1、优化is_prime函数,只需要检查到sqrt(n)就可以了。
2、prime_pq函数,可以考虑使用更高效的算法,如试除法结合埃拉托斯特尼筛法/Pollard's rho算法来找出质数因子。
3、并行化处理在多核处理器上运行,可以将筛选质数或者试除的过程进行并行化,进一步提高效率。
4、添加更多的错误检查和边界条件处理,例如检查输入的n是否为正整数。
以后有时间再来演示高阶算法。

相关文章:
《深度剖析算法优化:提升效率与精度的秘诀》
想象一下,你面前有一堆杂乱无章的数据,你需要从中找到特定的信息,或者按照一定的规则对这些数据进行排序。又或者,你要为一个物流公司规划最佳的配送路线,以降低成本和提高效率。这些问题看似复杂,但都可以…...
Mysql--重点篇--索引(索引分类,Hash和B-tree索引,聚簇和非聚簇索引,回表查询,覆盖索引,索引工作原理,索引失效,索引创建原则等)
索引是数据库中用于加速查询操作的重要机制。通过索引,MySQL可以快速定位到满足查询条件的数据行,而不需要扫描整个表。合理的索引设计可以显著提高查询性能,但不合理的索引可能会导致性能下降和磁盘空间浪费。因此,理解索引的工作…...
matlab使用 BP 神经网络进行数据预测的完整流程,包括数据读取、数据预处理等等
%% 初始化程序 warning off % 关闭报警信息 close all % 关闭所有图窗 clear % 清空变量 clc % 清空命令行 setdemorandstream(172) %设置随机种子为1%% 读取数据 data xlsread(Y.xlsx); %% 划分训练集…...
systemd-networkd NetworkManager 介绍
systemd-networkd 和 NetworkManager 的详细介绍 systemd-networkd 和 NetworkManager 都是 Linux 系统中常用的网络管理工具,但它们的设计目标和使用场景不同。以下是它们的详细介绍、功能、使用场景和差异。 1. systemd-networkd systemd-networkd 是一个由 syst…...
本地部署项目管理工具 Leantime 并实现外部访问
Leantime 是一款开源 AI 项目。它可以在本地直接运行大语言模型 LLM、生成图像、音频等。直接降低了用户使用AI的门褴。本文将详细的介绍如何利用 Docker 在本地部署 Leantime 并结合路由侠实现外网访问本地部署的 Leantime 。 第一步,本地部署安装 Leantime 1&am…...
PHP cURL 函数初学者完全指南
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
C#中的Array数组,List集合和ArrayList集合--07
目录 一.Array数组概念的简单理解 1.数组的初始化 2.数组的长度 3.数组的克隆和复制 4.数组的清空 5.数组的查找 6.数组的逆转 7.数组的拓展和缩减 8.数组的比较 9.数组的合并 10.使用Array类中的静态方法,如Array.Sort,Array.BinarySearch 等 二.Array数组进阶 1.二…...
基于深度学习的视觉检测小项目(十三) 资源文件的生成和调用
在使用 PySide6 进行开发时,管理应用程序的资源(如图标、图片、字体、样式表、音视频等)是一个常见的任务。PySide6 提供了一个工具 pyside6-rcc,它能够将资源文件(.qrc)编译成 Python 模块,然后…...
硬件实用技巧:TPS54331DR横杠标识识别1引脚
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/145116969 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
《C++11》nullptr介绍:从NULL说起
在C11之前,我们通常使用NULL来表示空指针。然而,NULL在C中有一些问题和限制,这就是C11引入nullptr的原因。本文将详细介绍nullptr的定义、用法和优点。 1. NULL的问题 在C中,NULL实际上是一个整数0,而不是一个真正的…...
自然语言处理基础:全面概述
自然语言处理基础:全面概述 什么是NLP及其重要性、NLP的核心组件、NLU与NLG、NLU与NLG的集成、NLP的挑战以及NLP的未来 自然语言处理(NLP)是人工智能(AI)中最引人入胜且具有影响力的领域之一。它驱动着我们日常使用的…...
网络安全的几种攻击方法
攻击方法 挂马: 就是在别人的网站文件里面放入网页木马或者是将代码潜入到对方正常的网页文件里,以使浏览者中马。 挖洞: 指漏洞挖掘。 加壳: 就是利用特殊的算法,将EXE可执行程序或者DLL动态连接库文件的编码进行改变(比如实现压缩、加密&a…...
国内源快速在线安装qt5.15以上版本。(10min安装好)(图文教程)
参考文章:Qt6安装教程——国内源-CSDN博客 1、在国内源上下载qt在线安装工具 NJU Mirror 2、 将下载好的在线安装工具,放到C盘根目录, 2.1 打开windows Powershell(WinX),下边那个最好。 输入两条指令&a…...
【pycharm发现找不到python打包工具,且无法下载】
发现找不到python打包工具,且无法下载 解决方法: 第一步:安装distutils,在CMD命令行输入: python -m ensurepip --default-pip第二步:检查和安装setuptools和wheel: python -m pip install --upgrade …...
C++ QT 自绘表盘
文章目录 效果图代码 效果图 代码 代码没什么好说的,直接上源码.h #pragma once#include <QWidget> #include <QPainter> #include <QResizeEvent> #include <QtMath> #include <QCoreApplication>class DialPlateWidget : public …...
数据科学与数据工程:两者的区别与交集
💖 欢迎来到我的博客! 非常高兴能在这里与您相遇。在这里,您不仅能获得有趣的技术分享,还能感受到轻松愉快的氛围。无论您是编程新手,还是资深开发者,都能在这里找到属于您的知识宝藏,学习和成长…...
MAC AndroidStudio模拟器无网络
先确认PC端是正常访问网络的; 模拟器端修改Wifi设置:设置 - 网络和互联网 - WALN设置 按照上图修改; IP设置:从DHCP修改为静态,IP地址:10.0.2.16 ,网关:10.0.2.2 , DNS…...
PHP语言的多线程编程
PHP语言的多线程编程 引言 在现代Web开发中,PHP以其简洁和易用性广受欢迎。它常用于构建动态网站和应用程序。然而,PHP本身是单线程的,这意味着它在处理多个任务时可能会受到性能限制。随着互联网的发展,对高并发、高可用性和实…...
当自动包布机遇上Profinet转ModbusTCP网关,“妙啊”,工业智能“前景无限
在自动化控制技术日新月异的当下,Profinet与ModbusTCP这两种协议在工业通信领域占据着举足轻重的地位。ModbusTCP是基于以太网的串行通信协议,而Profinet则是依托工业以太网的现场总线协议。它们在数据传输速度、实时性表现以及兼容性等方面各具特色。不…...
浅析大语言模型安全和隐私保护国内外标准和政策
过去两年,大模型技术已经普及并逐步渗透到各行各业,2025年注定是大模型应用井喷式发展的一年,AI在快速发展的同时,其带来的安全风险也逐渐凸显。人工智能系统的安全性和隐私保护已经成为社会关注的重点。 附下载:600多…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
