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,如果存在最优分解,则按从大到小的顺序输出分解的 数字,若不存在最优分解则输出-1.
输入:输入一个正整数n
输出:如果 n 存在最优分解,则在一行上按从大到小的顺序输出分解的数字,数 字之间用空格分隔;若不存在最优分解则输出-1.
输入样例:样例 1: 10
样例 2: 7
输出样例:样例 1: 8
样例2:-1
经演算发现,只有偶数才有最优分解。
所以我们不妨利用pow,先找出最接近n的pow(2,i),然后依次减去pow,直到n为0.
#include<stdio.h>
#include<math.h>
int main()
{
int n,i,j;
scanf("%d",&n);
if(n%2!=0)
{
printf("-1");
}
else{
for(i=n/2;n>0;i--)
{
j=i;
while(n<pow(2,j))
{
j--;
}
printf("%d ",(int)pow(2,j));
n-=pow(2,j);
}
}
return 0;
}
注:i=n/2是我随便找的一个数;
pow输出格式应该是%f,这里强制转换了一下;
多有不足请多指教。