【问题描述】
一个波斯的国王喜欢来自东方的瓷器,需要从波斯商人那去购买,为了避免瓷器损环,商人将瓷器安全地放在包装箱里。国王给商人提出一个瓷器的包装要求,即如果国王向商人要求购买N件瓷器,商人在不知道具体数量时必须给出整箱的瓷器,不能拆开包装箱。
商人当然可以使用1个包装箱包装1件瓷器来满足国王地需求,但是为了节省包装成本,如何将手中的瓷器进行包装既能满足国王的要求又能节省成本。请你编写程序输出国王购买N件瓷器时,每个包装中的瓷器数量,数量按照从大到小的次序输出。
【输入形式】
一个整数N。(0<N<2^31)
【输出形式】
空格隔开的每个包装的数量,从大到小排序。
【样例输入】
19
【样例输出】
16 2 1
【样例说明】
商人事先不知道国王的购买数量,需要先将瓷器包装好以满足各种可能。
========================================
分割线
这题读了好长时间还是不能理解题意,不过看给的样例大致猜出了题意:大致就是将一个整数化解成2的a1,a2,a3…之和,且尽可能的少,例如:19=16+2+1,38=32+4+2
然后根据此猜想解题 居然1A过了 注意的是8= 8 这种特殊情况
代码如下:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
long long num;
long long cnt1,cnt2;
cin>>num;
long long ans=num; //使ans来代替num ,不用也可以
while(ans>0){ //进行数的拆分
cnt1=log(ans)/log(2);
if(pow(2,cnt1+1)==ans) cnt1++; //即特判8=8 等情况不被继续分解
cnt2=pow(2,cnt1);
printf("%d ",cnt2 );
ans-=pow(2,cnt1);
}
return 0;
}