DB_xiaokai 2024-07-14 10:21 采纳率: 0%
浏览 1

Python 一道简单的题有个测试点超时

#pta团队程序设计天梯赛第九题有一个测试点不通过

def gongbei(x,y):
    for i in range(x+1,1,-1):
        if x % i == 0 and y % i == 0:
            return x * y // i
        elif i == 2:
            return x * y
a = input()
b = list(input().split())
c = []
for i in range(0,len(b)):
    c.extend(b[i].split(sep="/"))
c = list(map(int,c))
b = c.copy()
for i in range(1,len(c)-2,2):
    c[i+2]=gongbei(c[i],c[i+2])
zonghe = 0
a = c[len(c) - 1]
for i in range(0,len(c),2):
    zonghe+=b[i] * (a // b[i+1])
if zonghe==0:
    print(zonghe)
if abs(zonghe) // a:
        if zonghe < 0:
            print("-",end="")
        print(abs(zonghe) // a, end="")
        if abs(zonghe) % a != 0:
            print(" ",end="")
left = abs(zonghe) % a
if left != 0:
    for i in range(left,1,-1):
        if left % i == 0 and c[len(c)-3] % i == 0:
            left = left // i
            a = a // i
            break
    if zonghe < 0 and abs(zonghe) // a == 0:
        print("-", end="")
    print(f"{left}/{a}")

#题目
输入格式:
输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:
输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:
5
2/5 4/15 1/30 -2/60 8/3
输出样例1:
3 1/3
输入样例2:
2
4/3 2/3
输出样例2:
2
输入样例3:
3
1/3 -1/6 1/8
输出样例3:
7/24

img

  • 写回答

4条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-14 10:21
    关注

    引自免费微信小程序:皆我百晓生

    你的代码主要处理的是关于有理数的加法以及结果的简化。超时的原因可能在于计算效率上,特别是在处理大数据或有复杂循环时。根据你提供的代码和问题描述,我注意到一些可能的优化点:

    1. gongbei 函数:该函数是为了求两个数的最大公约数。然而,其内部的循环逻辑可以优化。例如,可以直接使用Euclid算法来求最大公约数,而不是遍历所有可能的除数。
    2. 在计算总和 zonghe 时,你的代码对于每个有理数都进行了复杂的运算。如果输入的有理数数量很大,这可能会导致运行时间增加。考虑预先处理每个有理数,将其转换为最简形式,然后再进行相加。
    3. 对于最后的分数简化部分,你的代码逻辑是正确的,但可能存在效率不高的问题。特别是当处理大的分数和复杂的循环时。

    基于上述观点,我为你优化了你的代码:

    首先,我们来优化求最大公约数的函数:

    def gcd(x, y):
        while y:
            x, y = y, x % y
        return x
    

    接下来,我们处理输入并计算总和:

    def calculate_sum(*args):
        numerator_sum = 0
        denominator_sum = 1  # 初始分母设为1,方便后续计算
        for num, denom in args:
            # 为了避免多次运算,预先将每个有理数转为简单形式
            num_simple = num // gcd(num, denom)  # 分子转换为最简形式
            denom_simple = denom  # 分母保持不变(已是最简形式)
            numerator_sum += num_simple * denominator_sum  # 更新分子总和
            denominator_sum *= denom_simple  # 更新分母总和(累乘所有分母)
        return numerator_sum // denominator_sum, numerator_sum % denominator_sum  # 返回整数部分和分数部分(如果整数部分为0,只返回分数部分)
    
    # 输入部分省略,假设输入已经通过上面的变量给定
    N = int(input())  # 获取有理数数量
    numbers = [int(i[:-1]) for i in input().split()]  # 获取分子和分母列表(假设输入格式与题目一致)
    pairs = list(zip(*[iter(numbers)]*2))  # 将分子和分母分开为两个列表,便于处理
    simplified_sum = calculate_sum(*pairs)  # 计算简化后的总和
    print(*simplified_sum)  # 输出结果(整数部分在前,分数部分在后)
    

    对于你提到的测试点超时问题,优化后的代码应该能显著提高计算效率。如果仍然超时,可能需要进一步分析具体的数据规模和测试环境。希望这些建议能帮到你!

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月14日

悬赏问题

  • ¥20 为什么安装CSiBridge时出现了这个问题,尝试了很多方法都不行,求详细操作步骤?
  • ¥15 鼠标右键,撤销删除 复制 移动,要怎样删除
  • ¥15 使用MATLAB进行余弦相似度计算加速
  • ¥15 服务器安装php5.6版本
  • ¥15 我想用51单片机和数码管做一个从0开始的计数表 我写了一串代码 但是放到单片机里面数码管只闪烁一下然后熄灭
  • ¥20 系统工程中,状态空间模型中状态方程的应用。请猛男来完整讲一下下面所有问题
  • ¥15 我想在WPF的Model Code中获取ViewModel Code中的一个参数
  • ¥15 arcgis处理土地利用道路 建筑 林地分类
  • ¥20 使用visual studio 工具用C++语音,调用openslsx库读取excel文件的sheet问题
  • ¥100 寻会做云闪付tn转h5支付链接的技术