php解现有i张十元纸币,笔试-纸币找零算法

最近朋友面试遇到一个有意思的算法题,记录一下

题目如下:

1、现有i 张十元纸币,j张五元纸币,k张两元纸币,购物后要支付n元(i,j,k,n为整数)。要求编写一个复杂度为O(1)的函数FindSolution(i,j,k,n)功能是计算出能否用现在手上拥有的纸币是否足够并能刚好拼凑齐 n元,而不需要找零。

#! /usr/bin/env python

# -*-coding: utf-8 -*-

def test():

print('设置拥有面值10、5、2的张数:')

ten, five, two = [int(i) for i in input().split(',')]

print("请输入需要计算的总金额")

# 循环输入总金额进行计算

# 用户输入总金额

amount = int(input())

while amount > 0:

calculation(ten, five, two, amount)

amount = int(input())

if amount <= 0:

print('输入金额数不能小于或等于零')

return

# 整体思路:

# 从最大到最小面值依次使用,当出现最大面值使用后出现余数为其余下面值处理不了时考虑少使用一个或多个纸币

# 1.面值2与5能共同处理的余数为:2、4、5、6、7、8、9、10、11、12、13到无群大

# 2.面值2能处理的余数为:2、4、6、8等偶数

# 当面值10求余为1、3时,需要少一个面值10,将余数变为11、13

# 当面值5求余为1、3等奇数时,需要少一个面值5,将余数变为6、8等偶数

def calculation(ten, five, two, amount):

# 超出拥有总金额,提升钱不够

total = ten * 10 + five * 5 + two * 2

if amount > total:

print('输入金额超出总金额 %d' % total)

return

# 计算需要面值10的张数

tenUse = amount // 10

tenUse = tenUse if (ten >= tenUse) else ten

tempRemainder = amount - tenUse * 10

if tenUse > 0:

if tempRemainder == 1 or tempRemainder == 3:

tenUse -= 1

tempRemainder += 10

# 计算需要面值5的张数

fiveUse = tempRemainder // 5

fiveUse = fiveUse if (five >= fiveUse) else five

tempRemainder -= fiveUse * 5

if fiveUse > 0:

if tempRemainder % 2 != 0:

fiveUse -= 1

tempRemainder += 5

# 计算需要面值2的张数

twoUse = tempRemainder // 2

twoUse = twoUse if (two >= twoUse) else two

tempRemainder -= twoUse * 2

# 通过余数为零来判断是否无需找零

if tempRemainder == 0:

print('无需找零,使用%2d张十元,%d张五元,%d张两元' % (tenUse, fiveUse, twoUse))

else:

print('!存在找零,拥有%2d张十元,%d张五元,%d张两元' % (ten, five, two))

if __name__ == "__main__":

test()

运算结果

1eb0fce59d2e

image.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值