《深度剖析算法优化:提升效率与精度的秘诀》
想象一下,你面前有一堆杂乱无章的数据,你需要从中找到特定的信息,或者按照一定的规则对这些数据进行排序。又或者,你要为一个物流公司规划最佳的配送路线,以降低成本和提高效率。这些问题看似复杂,但都可以通过特定的算法来解决。算法就像是一把神奇的钥匙,为解决各种各样的问题提供了方法和途径。无论是在科学研究、商业运营还是日常生活中,算法都发挥着不可或缺的作用。
原型—源码
原型
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多…...
C++中显示与隐式加载dll的使用与区别
一、什么是 DLL?DLL(Dynamic Link Library) 是 Windows 下的动态链接库,包含可被多个程序共享的函数、资源或类。使用 DLL 可以实现代码复用、模块化设计和插件机制。在 C 中,调用 DLL 中的函数有两种主要方式…...
雪球网md5__1038参数逆向解析与Node.js复现
1. 这不是“破解”,而是对前端加密逻辑的常规逆向还原你打开雪球网任意一只股票详情页,F12 打开开发者工具,切到 Network 面板,刷新页面——很快就能在 XHR 请求里捕获到类似这样的接口:https://xueqiu.com/stock/cube…...
警惕!AI正在悄悄重构全球攻防格局
警惕!AI 正在悄悄重构全球攻防格局 热点聚焦 AI重构网络安全:全球巨头加速布局 2026年5月,全球网络安全领域迎来重大变革,AI技术正在重塑攻防格局。OpenAI发布专为网络安全防御打造的集成化AI平台Daybreak,将安全防…...
我靠这个测试设计方法,把漏测率降低了80%
当“直觉测试”撞上南墙很长一段时间里,我和许多测试同行一样,测试用例的设计主要依靠两样东西:需求文档和“测试直觉”。这种模式在业务逻辑相对简单、迭代速度平缓时还能勉强应付。一旦面对复杂的企业级应用、高频的敏捷迭代,或…...
科华UPS电源全品类汇总:选型与场景适配指南
科华UPS电源作为国内智慧电能领域的主流产品,覆盖家用、办公、机房、工业等全场景,产品系列丰富、规格齐全,但多数用户在选型时,常因分不清系列差异、功率适配、架构类型而踩坑。本文系统汇总科华UPS电源的核心分类、主流系列、核…...
在多轮对话应用中观察Taotoken计费对成本的影响
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在多轮对话应用中观察Taotoken计费对成本的影响 效果展示类,结合一个需要维护长上下文的多轮对话应用案例,…...
Gazebo Sim多旋翼控制:四轴飞行器动力学建模与PID调参
Gazebo Sim多旋翼控制:四轴飞行器动力学建模与PID调参 【免费下载链接】gz-sim Open source robotics simulator. The latest version of Gazebo. 项目地址: https://gitcode.com/gh_mirrors/gz/gz-sim Gazebo Sim是一款功能强大的开源机器人模拟器ÿ…...
Windows Cleaner:终极免费系统清理工具,彻底解决C盘空间不足问题
Windows Cleaner:终极免费系统清理工具,彻底解决C盘空间不足问题 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服! 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否经常遇到C盘爆红、…...
【C++】零基础入门 · 第 6 节:数组
上一节我们学习了函数,知道了如何把代码封装起来方便复用。但在实际编程中,你很快就会遇到一个问题:如果要存储 100 个学生的成绩,难道要定义 100 个变量吗?这显然不现实。数组就是 C++ 给出的答案——它让我们能用一个变量名管理一组相同类型的数据。 1. 为什么需要数组…...
AI 如何改变软件工程:Martin Fowler 视角 + 实战洞见
AI 如何改变软件工程:Martin Fowler 视角 实战洞见 AI(尤其是 LLM)是软件工程自高级语言(从汇编到 C/Fortran)以来最大的转变。它引入了非确定性(Non-deterministic)编程,改变了从编…...
