题目描述: 程序员Q小明打了一辆出租车去上班。出于职业敏感,他注意到这辆出租车的计费表有点问题,总是偏大。 出租车司机解释说他不喜欢数字4,所以改装了计费表,任何数字位置遇到数字4就直接跳过,其余功能都正常。喜 比如: 23再多一块钱就变为25;39再多一块钱变为50;399再多一块钱变为500;小明识破了司机的伎俩,准备利用自己的学识打败司机的阴谋。 给出计费表的表面读数,返回实际产生的费用。 输入描述: 只有一行,数字N,表示里程表的读数。(1<=N=888888888) 输出描述: 一个数字,表示实际产生的费用。以回车结束。 示例1 输入: 5 输出: 4 说明: 5表示计费表的表面读数。 4表示实际产生的费用其实只有4块钱。 示例2 输入: 17 输出: 15 说明: 17表示计费表的表面读数。 15表示实际产生的其实只有15块钱
解题思路:
此题考究数学思路,解题关键在于找到数字之间的规律。
1、按位计算:
给到一个自然数N,可以分解为 N = ……+百位*10*10+十位*10+个位*1
对于题目中的N的每一位上数字均逢4加1,则每一位上的有效数字仅为‘0-3’和‘5-9’共9个数字
由此,N的原数据可分解为 N_new= ……+新百位*9*9 +新十位*9+新个位*1;
2、每位数字重写:
如果当前数字大于4,则需要将对应数字减1;
如果小于4,则保持对应数字不变
代码部分
def actual_cost(N):
#乘法基数
base = 1
#实际费用
N_new = 0
while N > 0:
#取出每一位数字,个位、十位、百位、……依次计算
last_byte = N % 10
N //= 10
if last_byte > 4:
N_new += (last_byte - 1) * base
else:
N_new += last_byte * base
#最重要的部分,个位数基数为1,后续为1*9,1*9*9,……
base *= 9
return N_new
try:
n = int(input())
if '4' in str(n):
raise ValueError('{} is irregular'.format(n))
else:
print(actual_cost(n))
except ValueError as e:
print(e)
知识点:数
结语:越简单的题目解法应该越多,请路过大神留下新的思路供本小白学习一下,打开思路