《深度剖析算法优化:提升效率与精度的秘诀》
想象一下,你面前有一堆杂乱无章的数据,你需要从中找到特定的信息,或者按照一定的规则对这些数据进行排序。又或者,你要为一个物流公司规划最佳的配送路线,以降低成本和提高效率。这些问题看似复杂,但都可以通过特定的算法来解决。算法就像是一把神奇的钥匙,为解决各种各样的问题提供了方法和途径。无论是在科学研究、商业运营还是日常生活中,算法都发挥着不可或缺的作用。
原型—源码
原型
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多…...
保姆级教程:用Nordic NRF52832搞定SIF一线通协议收发(附完整代码)
Nordic NRF52832实战:SIF一线通协议全双工通信开发指南 在物联网设备开发中,单线通信协议因其布线简单、成本低廉而广受欢迎。SIF(Single Interface)作为一种轻量级一线通协议,特别适合传感器与控制器之间的短距离数据…...
XInput1_4.dll缺失怎么修复?2026年最新官方安全修复指南
XInput1_4.dll缺失怎么修复?2026年最新官方安全修复指南当你满心欢喜地连接好Xbox手柄,准备沉浸到最新游戏的紧张对决中,屏幕上却突然弹出“找不到XInput1_4.dll”或“XInput1_4.dll丢失”的错误提示,这确实让人瞬间扫兴。这个报错…...
Figma全中文界面解决方案:从安装到精通的实战指南
Figma全中文界面解决方案:从安装到精通的实战指南 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 作为一名中文设计师,你是否曾因Figma全英文界面而在操作时频繁…...
手把手教你用HuggingFace+BGE模型搭建本地向量检索系统(附FAISS实战代码)
从零构建基于BGE模型的本地语义搜索系统:代码级实践指南 在信息爆炸的时代,如何快速从海量文本中精准找到相关内容?语义搜索技术正成为解决这一痛点的利器。不同于传统的关键词匹配,语义搜索能理解查询背后的意图,找到…...
AI专著生成新玩法!掌握这些工具,快速产出高质量专业专著
学术专著写作挑战与 AI 辅助工具介绍 学术专著的根本价值在于其内容的系统性与内部逻辑的完整性,但这往往是写作中的一个重大挑战。相较于期刊论文专注于某个特定问题,学术专著必须构建一个包括绪论、理论框架、核心研究、应用拓展,以及结论…...
告别手动刷课!智慧树网课助手让你的学习效率提升50%
告别手动刷课!智慧树网课助手让你的学习效率提升50% 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 你是否厌倦了在智慧树平台上频繁点击"下一集"…...
【Java微服务Istio配置黄金法则】:20年架构师亲授5大避坑指南与生产级配置模板
第一章:Java微服务Istio配置的核心认知与演进脉络Istio 作为云原生服务网格的事实标准,其配置体系并非孤立存在,而是深度耦合于 Java 微服务的生命周期、通信契约与可观测性需求。早期 Spring Cloud Netflix 生态依赖客户端库(如 …...
SenseVoice Small模型可解释性:注意力权重可视化与关键语音片段定位
SenseVoice Small模型可解释性:注意力权重可视化与关键语音片段定位 1. 项目背景与意义 语音识别技术在日常生活中的应用越来越广泛,从智能助手到会议转录,从语音输入到多媒体内容处理,都离不开高效准确的语音转文字服务。Sense…...
如何通过LeaguePrank实现游戏界面个性化:打造独特的英雄联盟视觉体验
如何通过LeaguePrank实现游戏界面个性化:打造独特的英雄联盟视觉体验 【免费下载链接】LeaguePrank 项目地址: https://gitcode.com/gh_mirrors/le/LeaguePrank LeaguePrank是一款专注于英雄联盟客户端界面自定义的开源工具,它通过安全的官方LCU…...
Phi-4-mini-reasoning效果展示:中文长文本多跳推理与隐含前提挖掘
Phi-4-mini-reasoning效果展示:中文长文本多跳推理与隐含前提挖掘 1. 模型核心能力概览 Phi-4-mini-reasoning是一款专注于推理任务的文本生成模型,在数学推导、逻辑分析和多步推理等场景下展现出独特优势。与通用聊天模型不同,它专为"…...
