Pat 7-35 有理数均值

本文记录了一次在Pat 7-35有理数均值题目中遇到的编程挑战,从错误的求和、最大公约数导致的溢出、除0错误到最后的乘法交换律引发的溢出问题,详细描述了解决这些问题的过程和感悟,最终发现并修复了一个因为乘法交换律错误导致的程序溢出问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题目让我重新认识了找到程序的bug是多么难的一件事情。

以下是找错过程,记录一下,真是让我难忘。

先说一下自己遇到的问题与一些感悟,刚开始在本地写的时候,没有注意到求平均值,直接求和了,看到示例,才发现忽略了求平均值,于是就又加了一部分。原本想着这样就可以了,应该没有什么大问题了。

结果提交了上去,只通过了两个测试点,根据错误的提示,有一条是 若不随时化简,则会溢出,然后意识到自己是求出所有分母的最小公倍数,然后通分做的求和,分母的最小公倍数确实可能超出 int , 意识到这个,我又改写成了,每次加一个分数,然后化简后得到结果,循环这样处理,直到处理所有分数。

然后再次提交,这次又过了一个测试点,还有一个没过,给了一个新错误提示 浮点错误,想了半天,还是不知道错在哪里,还好的是旁边有帮助信息,进去查看一下,看到了浮点错误,提示道 可能遇到了 除0 错误。想了一下,因为我在程序里除数几乎都是最大公约数,难道是求出来的最大公约数有 0。这样一想,确实有可能,分子求和可能为 0,这只能说明我写的求最大公约数的函数有问题,又认真的看了一下, 确实如果有 0 作为参数,会返回 0。那么就对 0 特殊处理一下,自己给个样例测试一下,没有问题了,我想这次提交应该就能过了吧。

结果就是那么残忍,还是没过,不过 浮点错误消失了,又出现了 若不随时化简,则会溢出,什么情况,这怎么可能,我写的是每次对一个分数求和呀,每次都化简了呀。想了好久,会不会是因为分子太大了,是不是需要将假分数 换算成 真分数呢。实在没想到其他的错误可能,就按这个方向修改吧,tuple 中再增加一个 int 来保存真分数的整数部分,对函数修改了一下,再拿样例试一下,没得问题,ok,继续提交。

看到提交后提示的结果,我真的不知道说些什么好了,错误的监测点依旧没通过,错误也是没变。让人绝望呀,这不可能呀,整数部分单

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值