笔记:数字197可以被称为循环素数,因为197的3个数位循环移位后的数字197,971,719均为素数。求出任意正整数n以内一共有多少个这样的循环素数。100 以内这样的数字共有13个,


前言

数字197可以被称为循环素数,因为197的3个数位循环移位后的数字197,971,719均为素数。100 以内这样的数字共有13个, 如2、3、5、7、11、13、17,31,37,71、73,79.97。求出任意正整数n以内一共有多少个这样的循环素数。

循环素数是一种特殊的素数,它具有一个有趣的性质:对于其各个数位进行循环移位后的数字仍然是素数。例如,197是一个循环素数,因为它的各个数位循环移位后的数字197、971、719均为素数。在一定范围内,存在着一些这样的循环素数,而我们的目标是找出在给定范围内有多少个这样的循环素数。

接下来的代码将实现一个功能,用于计算在给定范围内循环素数的数量。用户可以输入一个正整数n,程序将返回在1到n范围内的循环素数的个数。


一、循环素数是什么??

循环素数是一种特殊的素数,具有以下性质:

1.素数性质: 循环素数是素数,即只能被1和自身整除的正整数。

2.循环性质: 循环素数的每一位数字循环移位后得到的数字仍然都是素数。例如,对于循环素数197,它的各个数位循环移位后的数字为197、971和719,这三个数字都是素数。

这种特殊性质使得循环素数在数学上具有一定的重要性和研究价值。在计算机科学领域,寻找循环素数的算法也是一个常见的问题,因为它们有时候被用于加密算法等领域。

二、编写代码

1.代码如下

代码如下(示例):

# (7)数字197可以被称为循环素数,因为1973个数位循环移位后的数字197,971,719均为素数。100 以内这样的数字共有13,
# 如2357111317,31,37,7173,79.97。求出任意正整数n以内一共有多少个这样的循环素数。

# 定义一个函数,用于检查一个数字是否为素数
def is_prime(num):
    # 如果数字小于2,不是素数
    if num < 2:
        return False
    # 从2到num的平方根遍历,检查是否有除了1和自身的因子
    for i in range(2, int(num**0.5) + 1):
        if num % i == 0:  # 如果有因子,则不是素数
            return False
    return True  # 如果没有因子,则是素数

# 定义一个函数,用于计算n以内的循环素数的个数
def count_circular_primes(n):
    count = 0  # 初始化计数器
    # 遍历从2到n的所有数字
    for num in range(2, n):
        # 如果num本身以及它的所有循环移位都是素数,则计数器加一
        if all(is_prime(int(str(num)[i:] + str(num)[:i])) for i in range(len(str(num)))):
            count += 1
    return count  # 返回循环素数的个数

# 主循环,接受用户输入的n值,并输出结果
while True:
    n = input("请输入正整数n(输入'exit'退出程序):")  # 获取用户输入
    if n == 'exit':  # 如果用户输入exit,则退出程序
        print("程序已退出。")
        break
    n = int(n)  # 将用户输入的值转换为整数类型
    result = count_circular_primes(n)  # 调用函数计算循环素数的个数
    print(f"在1-{n}范围内,共有{result}个循环素数。")  # 输出结果






2.优化代码

代码如下(示例):

# 定义一个函数,生成素数
def primes_sieve(limit):
    primes = [True] * limit  # 创建一个布尔列表,用于标记数字是否为素数
    primes[0], primes[1] = False, False  # 01不是素数,设置为False
    for i in range(2, int(limit**0.5) + 1):  # 遍历2sqrt(limit)的所有数字
        if primes[i]:  # 如果当前数字是素数
            primes[i*i:limit:i] = [False] * len(primes[i*i:limit:i])  # 将当前素数的倍数标记为非素数
    return [i for i, prime in enumerate(primes) if prime]  # 返回所有标记为素数的数字列表

# 定义一个函数,用于检查一个数字是否为循环素数
def is_circular_prime(num, primes_set):
    num_str = str(num)  # 将数字转换为字符串
    for _ in range(len(num_str)):  # 遍历数字的每一位
        if int(num_str) not in primes_set:  # 如果当前循环移位后的数字不在素数集合中
            return False  # 返回False,表示不是循环素数
        num_str = num_str[1:] + num_str[0]  # 将数字的第一位移到最后一位
    return True  # 如果所有循环移位后的数字都是素数,则返回True,表示是循环素数

# 定义一个函数,用于计算n以内的循环素数的个数
def count_circular_primes(n):
    primes_set = set(primes_sieve(n))  # 生成小于等于n的所有素数,并转换为集合
    count = sum(1 for num in range(2, n) if is_circular_prime(num, primes_set))  # 统计循环素数的数量
    return count  # 返回循环素数的个数

# 主循环,接受用户输入的n值,并输出结果
while True:
    n = input("请输入正整数n(输入'exit'退出程序):")  # 获取用户输入的正整数n
    if n == 'exit':  # 如果用户输入exit,则退出程序
        print("程序已退出。")
        break
    n = int(n)  # 将用户输入的值转换为整数类型
    result = count_circular_primes(n)  # 调用函数计算循环素数的个数
    print(f"在1-{n}范围内,共有{result}个循环素数。")  # 输出结果

如果不考虑提高效率和可读性可以参考代码
优化以提高效率和可读性。

1.使用素数生成器: 可以使用更高效的素数生成器而不是每次都检查一个数是否为素数。这样可以节省时间,特别是当处理大量的数字时。

2.优化循环检查: 可以简化循环移位的检查过程,避免每次都重新生成字符串进行切片,而是在数字转换为字符串后一次性生成所有可能的循环移位。

3.提取函数: 将检查数字是否为循环素数的部分提取成一个单独的函数,以提高可读性和模块化。


总结

总结

本文介绍了循环素数的概念以及如何使用 Python 编程语言来计算任意正整数范围内的循环素数的数量。首先,我们定义了循环素数的概念,说明了其在数学和计算机科学中的重要性。接着,我们展示了一个基本的算法,用于检查一个数字是否为循环素数,并计算了在给定范围内的循环素数的数量。

在代码实现部分,我们首先定义了一个函数 primes_sieve,用于生成小于等于给定限制的所有素数。然后,我们定义了一个函数 is_circular_prime,用于检查一个数字是否为循环素数。最后,我们定义了一个函数 count_circular_primes,用于计算给定范围内的循环素数的数量。通过主循环,我们可以接受用户输入的范围,并输出相应范围内的循环素数的数量。

在优化代码部分,我们对原始算法进行了一些改进,包括使用更高效的素数生成器、优化循环检查过程以及提取函数等。这些优化可以提高代码的效率和可读性,特别是在处理大量数字时。

综上所述,本文展示了如何使用 Python 编程语言解决循环素数的计算问题,并提出了一些优化方法以提高算法的效率和性能。

  • 22
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辞言i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值