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(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;
} 

欢迎各位大佬点拨点拨本菜鸡~

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值