@hsooo
查看原帖
@hsooo
1754194
threebody_3楼主2025/6/20 23:24

题目要求:根据输入的重量x(整数)和是否加急(字符c,'y'表示加急,'n'表示不加急)计算快递费用。

计费规则:

  1. 0 < x <= 1000 克:

加急(c=='y'): 13 元

不加急(c=='n'): 8 元

  1. x > 1000 克:

每500克加收4元(不足500克按500克计算),同时基础费用为:

加急:13元(但注意,这里基础费用似乎与1000克以内加急相同?实际上,超过1000克后,基础费用部分还是按照首重?)

然而,题目描述中,超过1000克的部分每500克加收4元,不足500克按500克计算。并且基础费用部分,加急是13,不加急是8。

但是,注意:超过1000克后,首1000克还是按照基础费用(8或13),然后超过部分每500克加4元,不足500克按500克计算。

所以,重新整理:

当x>1000时:

费用 = 基础费用(加急13,不加急8) + 续重费用

续重费用:超过1000克的部分,每500克4元,不足500克按500克计算。

例如:x=1200,不加急:8 + ceil((1200-1000)/500)*4 = 8 + ceil(200/500)*4 = 8 + ceil(0.4)4 = 8 + 14 = 12

加急:13 + 4 = 17

但是,原代码中对于超过1000克的处理有两种情况:

一种是刚好是500的倍数,另一种不是。实际上,我们可以统一处理:超过1000克的部分,计算超过的克数,然后除以500向上取整,再乘以4。

原代码在x>1000且不是500的倍数时,使用了这样的计算:

price = 13 (或8) + (int((x-1000)/500 + 1)) * 4

这里,(x-1000)/500 得到的是小数,然后取整(向下取整)再加1,相当于向上取整。例如:x=1200 -> (1200-1000)=200 -> 200/500=0.4 -> int(0.4)=0 -> 0+1=1 -> 乘以4得4。

然而,当x=1500(刚好500的倍数)时,原代码在第一种情况(x%500==0)中处理,用(x/500)*4,但是注意x是超过1000的部分,所以应该是(x-1000)/500,而原代码直接用了x/500,这显然是错误的。

例如:x=1500,不加急:

原代码:8 + (1500/500)4 = 8+34=8+12=20 -> 但正确应该是:8(基础) + ceil((1500-1000)/500)4 = 8 + ceil(500/500)=8+14=12

所以,原代码在x>1000时,分情况处理有误。特别是当x%500==0时,它没有减去1000,而是直接用x除以500,这样会多算(因为1000克以内已经包含在基础费用里了)。

因此,我们需要修正:

对于x>1000的情况:

基础费用:c=='y'?13:8

续重部分:超过1000克的部分为 (x-1000),然后计算这个差值需要多少个500克(向上取整),即 ceil((x-1000)/500.0),然后乘以4。

在编程中,我们可以这样计算续重部分:

extra = x - 1000

续重费用 = ((extra + 499) // 500) * 4 [因为向上取整:例如200-> (200+499)//500=699//500=1;500-> (500+499)//500=999//500=1(不对,应该是2?不对,500就是1个单位,因为500克一个单位,500/500=1,所以不需要加499,而是加499可以避免使用浮点?]

实际上,向上取整整数除法: (extra + 500 - 1) // 500 = (extra + 499) // 500

但是注意:当extra=0时,应该为0,但按照这个公式:0+499=499,499//500=0,正确。

extra=1:1+499=500,500//500=1,正确。

extra=500:500+499=999,999//500=1(因为整数除法向下取整),但我们需要的是1,因为500刚好是一个单位,所以正确。

因此,续重费用 = ((x - 1000) + 499) // 500 * 4

所以,整个代码可以简化为:

if x <= 1000:

price = 13 if c == 'y' else 8

else:

base = 13 if c == 'y' else 8

extra = x - 1000

计算续重的单位数(向上取整)

units = (extra + 499) // 500 # 或者 (extra - 1) // 500 + 1 也可以

additional = units * 4

price = base + additional

但是,原题中的例子:输入可能是多个,我们按照一行两个输入。

另外,注意题目中x>0。

我们按照上述思路重写代码。

但是,原代码中对于x%500==0的处理是直接(x/500)*4,这会导致错误(因为x=1500,那么1500/500=3,乘以4就是12,再加上基础费用8,得到20,而正确应该是基础费用8加上续重部分(500克)4元,共12元)。

因此,我们采用统一的方法:计算超过1000克的部分,用向上取整的方式计算单位数。

修正后的代码:

注意:题目输入是一行,两个数据,先x(重量)然后c(字符)

例如输入:1200 y

输出:17 (因为基础13+续重4=17)

现在,我们写代码:

这段代码用于计算快递费用,根据重量(x)和是否加急(c)来计算价格。规则如下:

0 < x ≤ 1000 克:

加急(c='y'):13元

不加急(c='n'):8元

x > 1000 克:

基础费用:加急13元,不加急8元

续重费用:超出1000克的部分,每500克加收4元(不足500克按500克计算)

代码问题分析 原代码在处理重量超过1000克时存在逻辑错误:

当重量是500的倍数时(x%500==0),错误地使用x/500计算续重单位(应该是(x-1000)/500)

续重单位计算不统一,导致结果错误

修复后的代码 python x, c = input().strip().split() x = int(x) price = 0

if 0 < x <= 1000: price = 13 if c == 'y' else 8 else: # 计算超出1000克的部分 extra = x - 1000 # 计算续重单位(向上取整) units = (extra + 499) // 500 # 等价于 math.ceil(extra/500) additional = units * 4

if c == 'y':
    price = 13 + additional
else:
    price = 8 + additional

print(price) 关键修正说明 统一续重计算:

先计算超出部分重量 extra = x - 1000

使用向上取整技巧 (extra + 499) // 500 计算续重单位

去除冗余条件:

删除原代码中x%500==0的特殊分支

统一处理所有超重情况

计算示例 1200克加急:

基础:13元

续重:(1200-1000)=200克 → 1个单位 → 4元

总价:13+4=17元

1500克不加急:

基础:8元

续重:(1500-1000)=500克 → 1个单位 → 4元

总价:8+4=12元

1800克加急:

基础:13元

续重:(1800-1000)=800克 → 2个单位 → 8元

总价:13+8=21元

此修正确保所有重量情况都能正确计算,特别是解决了原代码中重量为500倍数时的计算错误。

2025/6/20 23:24
加载中...