xdoj正数最优分解

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,这里强制转换了一下;

        多有不足请多指教。

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值