当前位置: 首页 > article >正文

幂运算转換

幂运算转換
(现将个整数的需运算,转换为质数的乘运算,质数按从小到大排序。
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
解答要求
限制:C/C++ 1000ms,
其他语言:2000ms
输入
整数的幂运算连乘表达式,表达式中只有乘和幂运算,其中*表示乘运算,^表示幂运算
整数的范围:[1,100000]指数范围:[1,100]
输入为一个合法的表这式,表达式最长为1000个字符。
输出
转换为质数的乘运算,质数按从小到大排序。
保证输出最长不超过100000.


输入: 6^3*10
输出: 2*2*2*2*3*3*3*5
解释:6^3*10
6*3可以拆分为质数乘(2"3)^3,进一步表示为2"2*2*3*3*310可以拆分为质数乘2*5


输入: 5*14
输出:2*5*7


请用python stdin stdout解本题

code

import sys
import math
from collections import defaultdict

def sieve_spf(max_num):
    """Sieve of Eratosthenes to compute smallest prime factor (spf) for each number up to max_num."""
    spf = [0] * (max_num + 1)# spf 数组用于存储每个数字的最小质因数,初始化为0(表示未计算)。
    spf[0], spf[1] = 0, 1
    for i in range(2, max_num + 1):
        # 遍历从2到max_num的每个数字,如果一个数字的最小质因数尚未计算(即spf[i] == 0),
        # 则将其最小质因数设为它自己,并更新所有该数字的倍数的最小质因数。
        if spf[i] == 0:
            spf[i] = i
            for j in range(i * i, max_num + 1, i):# 更新所有该数字的倍数的最小质因数
                if spf[j] == 0:# 只有当spf[j]==0的时候才更新
                    spf[j] = i
    return spf

def factorize(x, spf):
    """Factorize x using the precomputed spf table. Returns a list of prime factors."""
    # 使用预先计算好的spf表来分解一个数x,返回一个包含x所有质因数的列表。
    # 通过不断地除以x的最小质因数来分解x,直到x变为1。
    factors = []
    while x > 1:
        factors.append(spf[x])
        x //= spf[x]
    return factors

def main():
    # input_expr = sys.stdin.read().strip()
    input_expr = input("please input your expression:").strip()

    if not input_expr:
        print("")
        sys.exit(0)

    # Precompute SPF up to 100,000
    MAX_NUM = 100000
    spf = sieve_spf(MAX_NUM)

    # Split the expression by '*'
    terms = input_expr.split('*')

    prime_counts = defaultdict(int) # 统计每个质因数出现的次数

    for term in terms:
        if '^' in term:
            base_str, exp_str = term.split('^')
            base = int(base_str)
            exponent = int(exp_str)
        else:
            base = int(term)
            exponent = 1

        if base == 1:
            continue  # 1 has no prime factors

        factors = factorize(base, spf)
        for prime in factors:
            prime_counts[prime] += exponent  # 2^3 也就是2会出现3次

    if not prime_counts:
        print("")
        sys.exit(0)

    # Collect primes in sorted order
    sorted_primes = sorted(prime_counts.keys())  # 按字典的key进行排序

    # Build the output list
    output = []
    for prime in sorted_primes:
        count = prime_counts[prime]
        output.extend([str(prime)] * count)

    # Join with '*'
    print('*'.join(output))

if __name__ == "__main__":
    main()

这段代码是埃拉托斯特尼筛法(Sieve of Eratosthenes)的一个变种,用于计算每个数字的最小质因数(smallest prime factor, SPF)。我将详细解释这段代码的逻辑:

  1. 外层循环

    • for i in range(2, max_num + 1):从2开始遍历到max_num。这个循环用于找到每个数字的最小质因数。
  2. 内层循环

    • for j in range(i * i, max_num + 1, i):这个循环从i * i开始,到max_num + 1结束,步长为i。这个循环的目的是更新所有i的倍数的最小质因数。
  3. 更新最小质因数

    • if spf[j] == 0:检查j的最小质因数是否已经计算过。如果spf[j]为0,表示j的最小质因数尚未计算。
    • spf[j] = i:将j的最小质因数设为i

详细解释:

  • 为什么从i * i开始

    • 当我们找到一个质数i时,所有小于i * ii的倍数(如2*i, 3*i, …, (i-1)*i)在之前的步骤中已经被处理过了,因为它们的最小质因数是小于i的质数。因此,我们从i * i开始,因为这是第一个可能的i的倍数,其最小质因数是i
  • 为什么步长为i

    • 我们需要更新所有i的倍数的最小质因数,因此每次增加i,即i * i, i * (i + 1), i * (i + 2), ...
  • 为什么只更新spf[j]为0的情况

    • 如果spf[j]已经不为0,说明j的最小质因数已经被计算过,我们不需要再次更新它。只有当spf[j]为0时,我们才将j的最小质因数设为i

例子:

假设max_num = 10,我们来逐步计算spf数组:

  1. 初始化

    • spf = [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
  2. i = 2

    • spf[2] = 2
    • 更新j = 4, 6, 8, 10
      • spf[4] = 2
      • spf[6] = 2
      • spf[8] = 2
      • spf[10] = 2
    • spf = [0, 1, 2, 0, 2, 0, 2, 0, 2, 0, 2]
  3. i = 3

    • spf[3] = 3
    • 更新j = 9
      • spf[9] = 3
    • spf = [0, 1, 2, 3, 2, 0, 2, 0, 2, 0, 2]
  4. i = 4

    • spf[4]已经为2,跳过。
  5. i = 5

    • spf[5] = 5
    • spf = [0, 1, 2, 3, 2, 5, 2, 0, 2, 0, 2]
  6. i = 6

    • spf[6]已经为2,跳过。
  7. i = 7

    • spf[7] = 7
    • spf = [0, 1, 2, 3, 2, 5, 2, 7, 2, 0, 2]
  8. i = 8

    • spf[8]已经为2,跳过。
  9. i = 9

    • spf[9]已经为3,跳过。
  10. i = 10

    • spf[10]已经为2,跳过。

最终,spf数组为:
[ [0, 1, 2, 3, 2, 5, 2, 7, 2, 3, 2]]

这个数组表示每个数字的最小质因数。例如,spf[10] = 2表示10的最小质因数是2。


http://www.kler.cn/a/444725.html

相关文章:

  • 数据结构漫游记:初识vector
  • 批量DWG文件转dxf(CAD图转dxf)——c#插件实现
  • flask before_request 请求拦截器返回无值则放行,有值则拦截
  • SSM 与 Vue 共筑电脑测评系统:精准洞察电脑世界
  • NVIDIA发布紧凑型生成式AI超级计算机:性能提升,价格更低
  • 将 Matplotlib 图形转换为 PIL 图像并返回
  • Java基本概念6-JVM2
  • C语言中的变量自加操作:前自加与后自加的深入解析
  • AtomGit 开源生态应用开发赛报名开始啦
  • 【优选算法---前缀和】和为K的子数组、和可被K整除的子数组、连续数组、矩阵区域和
  • 武汉市电子信息与通信工程职称公示了
  • Guava 库中的 `Multimap` 是一个允许一个键对应多个值的集合 Guava `Multimap` 的基本代码示例:
  • CSSmodule的作用是什么
  • 《 QT 5.14.1 类库模块列表详述》
  • 解决 Amazon S3 管理控制台中 5GB 大小限制的问题
  • 【Rust自学】4.2. 所有权规则、内存与分配
  • 1688商品爬取:商品信息与价格接口获取指南
  • 【设计模式】空接口
  • Web3 时代:技术变革与未来展望
  • Three.js材质纹理扩散过渡
  • 力扣--LCR 53.最大数组和
  • 多模态抽取图片信息的 Prompt
  • finereport新的数据工厂插件使用场景 二 参数混合计算场景
  • HTMLCSS:超丝滑的加载动画效果
  • Linux shell脚本用于常见图片png、jpg、jpeg、tiff格式批量转webp格式后,并添加文本水印
  • 通过阿里云 Milvus 和 LangChain 快速构建 LLM 问答系统