1778: 分钱哪
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 241 Solved: 52
[ Submit][ Status][ Web Board]
Description
生活在杭州,大家是不是习惯了出门只带一只手机就好啦,无论是大商场还是街边小摊都能用上支付宝,不得不说真是方便呀,知识改变命运,科技改变生活,代码改变世界,每当放假回家,我就回到了没有支付宝的地方了,然后,就要使用人民币啦,麻烦的是大部分情况下是要找零,为了不找零,于是我决定事先做好准备,我把钱数好,然后放在一个个钱袋里面,以便在我现有的支付能力下,任何数目的钱,我都能够使用我事先准备好的小钱进行支付。当然,我很穷所以我想用最少的钱袋来实现这个愿望,并且不存在两个钱袋中装有相同的大于1的钱数。假设我有m个1元硬币,你能猜到我会用多少个钱袋?
Input
第一行T(T<=1000000),接下来一个整数,表示我现有的总的硬币数目m,其中,1≤m ≤1000000000
Output
Case #x: y,x表示测试编号从1开始,y一个整数表示答案
Sample Input
2
3
4
Sample Output
Case #1: 2
Case #2: 3
【解析】
这道题刚开始做的时候就知道是个规律题,队友一直在找规律,找出一个规律来不过那个时间复杂度也挺高的,
所以还是需要再找,比完之后问了别人才知道,这个其实是这样子的,比如你有2块钱,你放几个袋子能凑上1,2
肯定需要2个袋子,你第二个袋子放2的话,你有3个硬币,你只需要2个袋子就可以凑出1,2,3了,之后我们有四个
硬币了,我们需要几个袋子?答案是3个,第一个袋子放1,第2个袋子放2,第三个袋子放4,这样的话发现4,5,6,7
全部凑出来了,一次类推8个硬币需要4个袋子,可以凑到15为止,所以我们就能发现规律所在了。
#include<iostream>
#include<string>
#include<cstdio>
using namespace std;
int main()
{
int n,m,p=0;
scanf("%d",&n);
while(n--)
{
int count1=0;
p++;
scanf("%d",&m);
while(m!=0)
{
m=m/2;
count1++;
}
printf("Case #%d: %d\n",p,count1);
}
return 0;
}