鱼C论坛

 找回密码
 立即注册
查看: 2116|回复: 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]
想知道小甲鱼最近在做啥?请访问 -> 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代码实现:
def count_primes(n):
    is_prime = [True] * (n+1)
    count = 0
    for i in range(2, n+1):
        if is_prime[i]:
            count += 1
            j = i * i
            while j <= n:
                is_prime[j] = False
                j += i
    return count
时间复杂度为O(N*log(logN))。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

N = 3
print(count_primes(N))  # 输出质数数量

来自ChatGPT
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

A: 可以使用埃拉托斯特尼筛法(Sieve of Eratosthenes)更高效地找出给定范围内的质数。以下是使用该方法的Python代码:
def sieve_of_eratosthenes(N):
    is_prime = [True] * (N + 1)  # 初始化一个布尔列表,标记每个数是否为质数
    is_prime[0] = False  # 0不是质数
    is_prime[1] = False  # 1不是质数
    prime_count = 0  # 初始化质数计数器

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

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

    return prime_count

N = 3
print(sieve_of_eratosthenes(N))

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

来自ChatGPT
想知道小甲鱼最近在做啥?请访问 -> 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实现:
def sieve_of_linear(N):
    is_prime = [True] * (N + 1)  # 初始化一个布尔列表,标记每个数是否为质数
    primes = []  # 初始化一个空列表,用于存储质数
    is_prime[0] = False  # 0不是质数
    is_prime[1] = False  # 1不是质数

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

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

            if i % prime == 0:
                break

    return len(primes)

N = 3
print(sieve_of_linear(N))

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

来自ChatGPT
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2023-4-30 00:17:58 From FishC Mobile | 显示全部楼层
哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-28 17:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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