[编程题]找零
空间限制:C/C++ 32M,其他语言64M
Z国的货币系统包含面值1元、4元、16元、64元共计4种硬币,以及面值1024元的纸币。现在小Y使用1024元的纸币购买了一件价值为N (0 < N \le 1024)N(0<N≤1024)的商品,请问最少他会收到多少硬币?
输入描述:
一行,包含一个数N。
输出描述:
一行,包含一个数,表示最少收到的硬币数。
示例1
输入
200
输出
17
说明
花200,需要找零824块,找12个64元硬币,3个16元硬币,2个4元硬币即可。
备注:
对于100%的数据,N (0 < N \le 1024)N(0<N≤1024)。
思路
题目里1,4,16,64,1024这些数字都在疯狂暗示我们使用位运算。
下面结合第一个用例说明解法:
1024-200=824,二进制表示就是1100111000。
二进制下硬币规格有1,100,10000,1000000。
(以下都是基于二进制表述)
[0,100)元用1元硬币找零,那么截取后两位可以得1元硬币数;
[100,10000)元用100元硬币找零,再截取后两位可以得100元硬币数;
[10000,1000000)元用10000元硬币找零,再截取后两位可以得10000元硬币数;
[10000,
)元用1000000元硬币找零,截取剩下的就是1000000元硬币数。
而这个截取是通过位运算,例如截取倒数三四位,先右移两位,然后位与11即可。
我的代码
C++
#include <iostream>
using namespace std;
int main()
{
int money;
cin >> money;
money = 1024 - money;
cout<< (money & 3) + ((money >> 2) & 3) + ((money >> 4) & 3) + (money >> 6);
}
Go
package main
import "fmt"
func main() {
money:=0
fmt.Scan(&money)
money=1024-money
fmt.Println(money&3+(money>>2)&3+(money>>4)&3+money>>6)
}