1. 正整数的最优分解
描 述 : 任 意 一 个 自 然 数 都 可 以 分 解 成 若 干 个 2 的 幂 次 之 和 , 例 如 : 7=1+2+4=2 0 +2 1 +2 2 ,10=8+2=2 3 +2 1。这些分解中有唯一一个最优分解,既分解为若干 个不同的 2 的正整数次幂之和。所以,10=2 3 +2 1是一个最优分解,而 7=2 0 +2 1 +2 2不 是最优分解,因为 2 0不是 2 的正整数次幂。 输入一个正整数 n(n<220),如果存在最优分解,则按从大到小的顺序输出分解的 数字,若不存在最优分解则输出-1.
输入:输入一个正整数 n
输出:如果 n 存在最优分解,则在一行上按从大到小的顺序输出分解的数字,数 字之间用空格分隔;若不存在最优分解则输出-1.
输入样例:
样例 1: 10
样例 2: 7
输出样例:
样例 1: 8
2 样例
2:-1
刚开始看完这道题是非常蒙的,在草稿纸上算了算几个数,自己总结了一下规律,发现是偶数都有正数的最优分解,奇数都没有正数的最优分解(一定有2的零次幂)
所以接下来只需处理偶数的最优分解问题
感觉自己的思路不好用文字描述,就直接上代码吧~
#include<stdio.h>
#include<math.h>
int main(){
int n,i;
scanf("%d",&n);
double convert=n*1.0;
if(n%2==1){
printf("-1");
}
else{
i=0;
do{
i++;
//printf("i=%d,pow(2,i)=%.0f\n",i,pow(2,i));
}while(pow(2,i)<convert);
if(pow(2,i)==convert){
printf("%.0f",pow(2,i));
}
else{
i--;
do{
n-=pow(2,i);
if(n<0){
n+=pow(2,i);
i--;
}
else{
printf("%.0f ",pow(2,i));
}
i--;
}while(n!=pow(2,i));
printf("%.0f ",pow(2,i));
}
}
return 0;
}
欢迎各位大佬点拨点拨本菜鸡~