鱼C论坛

 找回密码
 立即注册
查看: 2542|回复: 6

[技术交流] ChatGPT来做题

[复制链接]
发表于 2023-4-15 10:18:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 凌九霄 于 2023-4-15 10:56 编辑

给你一个正整数N(1 <= N <= 10000000),求{1,2,3,...,N}中质数的个数。 如N=3, 输出2.

ChatGPT一如既往的立马给出答案,同学们也可自行练习下

游客,如果您要查看本帖隐藏内容请回复
[/hide]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-4-15 10:39:36 | 显示全部楼层
可以使用筛法(Sieve of Eratosthenes)来求解{1,2,3,...,N}中质数的个数。具体步骤如下:

初始化一个长度为N+1的布尔数组is_prime,其中is_prime[ i ]表示数字i是否为质数,初始值全部为true。

从2开始遍历到N,对于每个数i,如果is_prime[ i ]为true,则i是质数。将其所有的倍数(除了它本身)标记为非质数,即将is_prime[j]置为false,其中j=ii, i(i+1), i*(i+2), ... 直到i*j > N。

统计is_prime中true的个数,即为{1,2,3,...,N}中质数的个数。

以下是Python代码实现:
  1. def count_primes(n):
  2.     is_prime = [True] * (n+1)
  3.     count = 0
  4.     for i in range(2, n+1):
  5.         if is_prime[i]:
  6.             count += 1
  7.             j = i * i
  8.             while j <= n:
  9.                 is_prime[j] = False
  10.                 j += i
  11.     return count
复制代码
时间复杂度为O(N*log(logN))。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-15 10:40:38 | 显示全部楼层
  1. # 判断一个数是否为质数的函数
  2. def is_prime(n):
  3.     if n < 2:  # 小于2的数不是质数
  4.         return False
  5.     if n == 2:  # 2是质数
  6.         return True
  7.     if n % 2 == 0:  # 排除偶数,因为偶数肯定不是质数(除了2)
  8.         return False
  9.     # 只判断奇数,范围缩小一半。此处的范围是从3到n的平方根(向上取整),步长为2
  10.     for i in range(3, int(n**0.5) + 1, 2):
  11.         if n % i == 0:  # 若n可以被i整除,则n不是质数
  12.             return False
  13.     return True  # 其他情况下,n是质数

  14. # 质数生成器,用于在给定范围内生成素数
  15. def prime_generator(N):
  16.     for i in range(2, N + 1):  # 遍历范围内的所有数
  17.         if is_prime(i):  # 若当前数是质数
  18.             yield i  # 使用yield返回当前质数

  19. # 统计给定范围内质数的数量
  20. def count_primes(N):
  21.     return sum(1 for _ in prime_generator(N))  # 计算prime_generator中质数的个数

  22. N = 3
  23. print(count_primes(N))  # 输出质数数量
复制代码


来自ChatGPT
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-15 10:46:12 | 显示全部楼层

Q: 有没有更高效率的方法?

A: 可以使用埃拉托斯特尼筛法(Sieve of Eratosthenes)更高效地找出给定范围内的质数。以下是使用该方法的Python代码:

  1. def sieve_of_eratosthenes(N):
  2.     is_prime = [True] * (N + 1)  # 初始化一个布尔列表,标记每个数是否为质数
  3.     is_prime[0] = False  # 0不是质数
  4.     is_prime[1] = False  # 1不是质数
  5.     prime_count = 0  # 初始化质数计数器

  6.     for i in range(2, int(N**0.5) + 1):
  7.         if is_prime[i]:  # 如果当前数字是质数
  8.             prime_count += 1  # 计数器加1
  9.             # 从当前质数的平方开始,标记所有倍数为非质数
  10.             for j in range(i*i, N + 1, i):
  11.                 is_prime[j] = False

  12.     # 对剩余的未检查的数,如果是质数,则计数器加1
  13.     for i in range(int(N**0.5) + 1, N + 1):
  14.         if is_prime[i]:
  15.             prime_count += 1

  16.     return prime_count

  17. N = 3
  18. print(sieve_of_eratosthenes(N))
复制代码


埃拉托斯特尼筛法利用质数的倍数属性,在整个范围内通过排除质数的倍数来找出质数。这种方法相较于之前的方法,执行效率更高。

来自ChatGPT
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-15 10:48:29 | 显示全部楼层
isdkz 发表于 2023-4-15 10:46
Q: 有没有更高效率的方法?

A: 可以使用埃拉托斯特尼筛法(Sieve of Eratosthenes)更高效地找出给定 ...


Q: 还有更高效率的方法吗?

A: 是的,还有一种比埃拉托斯特尼筛法更高效的方法,叫做线性筛法(Sieve of Linear),它的时间复杂度是O(N),下面是线性筛法的Python实现:

  1. def sieve_of_linear(N):
  2.     is_prime = [True] * (N + 1)  # 初始化一个布尔列表,标记每个数是否为质数
  3.     primes = []  # 初始化一个空列表,用于存储质数
  4.     is_prime[0] = False  # 0不是质数
  5.     is_prime[1] = False  # 1不是质数

  6.     for i in range(2, N + 1):
  7.         if is_prime[i]:  # 如果当前数字是质数
  8.             primes.append(i)  # 将其添加到质数列表中

  9.         # 遍历质数列表,并在is_prime中标记当前数i与质数列表中的质数的乘积为非质数
  10.         for prime in primes:
  11.             if i * prime > N:
  12.                 break
  13.             is_prime[i * prime] = False

  14.             if i % prime == 0:
  15.                 break

  16.     return len(primes)

  17. N = 3
  18. print(sieve_of_linear(N))
复制代码


线性筛法通过合并埃拉托斯特尼筛法中的重复操作,进一步提高了筛选质数的效率。但是,线性筛法的空间复杂度仍然是O(N),在处理大范围的数时可能需要大量内存。

来自ChatGPT
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-4-15 10:53:24 | 显示全部楼层
上面各位的回复都很精彩,但是.......所以,很打击想要继续学习编程的信心和决心啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-4-30 00:17:58 From FishC Mobile | 显示全部楼层
哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-24 14:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表