国王的瓷器(题解)
【问题描述】
一个波斯的国王喜欢来自东方的瓷器,需要从波斯商人那去购买,为了避免瓷器损环,商人将瓷器安全地放在包装箱里。国王给商人提出一个瓷器的包装要求,即如果国王向商人要求购买N件瓷器,商人在不知道具体数量时必须给出整箱的瓷器,不能拆开包装箱。
商人当然可以使用1个包装箱包装1件瓷器来满足国王地需求,但是为了节省包装成本,如何将手中的瓷器进行包装既能满足国王的要求又能节省成本。请你编写程序输出国王购买N件瓷器时,每个包装中的瓷器数量,数量按照从大到小的次序输出。
【输入形式】
一个整数N。(0
空格隔开的每个包装的数量,从大到小排序。
【样例输入】
19
【样例输出】
16 2 1
【样例说明】
商人事先不知道国王的购买数量,需要先将瓷器包装好以满足各种可能。
========================================
分割线
这题读了好长时间还是不能理解题意,不过看给的样例大致猜出了题意:大致就是将一个整数化解成2的a1,a2,a3…之和,且尽可能的少,例如:19=16+2+1,38=32+4+2
然后根据此猜想解题 居然1A过了 注意的是8= 8 这种特殊情况
代码如下:
#include
#include
#include
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;
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
