4行代码 [编程题]找零 C++ Golang 位运算 字节跳动

[编程题]找零

空间限制: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, \infty )元用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)
}
发布了38 篇原创文章 · 获赞 0 · 访问量 1024

猜你喜欢

转载自blog.csdn.net/Cyan1956/article/details/104918350