算法训练 幂方分解(C/C++)

这篇博客介绍了一种使用C/C++进行幂方分解的方法。通过预先计算2的幂次并存储在数组中,可以高效地对正整数进行拆分。对于大于2的数,首先找到比其大的最小2的幂,然后逐步拆分,避免2被错误拆分为2(0)。在拆分过程中,特别处理了2的情况,确保不将其拆分为2(0)。
摘要由CSDN通过智能技术生成
问题描述
  任何一个正整数都可以用2的幂次方表示。例如:
  137=2^7+2^3+2^0
  同时约定方次用括号来表示,即ab 可表示为a(b)。
  由此可知,137可表示为:
  2(7)+2(3)+2(0)
  进一步:7= 2^2+2+2^0 (21用2表示)
  3=2+2^0
  所以最后137可表示为:
  2(2(2)+2+2(0))+2(2+2(0))+2(0)
  又如:
  1315=2^10 +2^8 +2^5 +2+1
  所以1315最后可表示为:
  2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入格式
  输入包含一个正整数N(N<=20000),为要求分解的整数。
输出格式
  程序输出包含一行字符串,为符合约定的n的0,2表示(在表示中不能有空格)

分析:
看数据规模N<=20000,可以用一个数组存放2的0次幂到16次幂,减少计算量。
首先,正整数中只有1,2不用二次拆分,1=2(0),2=2,直接输出即可;
其次,n>2都需要二次拆分,第一次拆分如137,拆分为2(7)+2(3)+2(0),要实现这一步拆分需要
① 若n不是2的整数幂,找到比n大的最小指数幂a[i],从a[i-1] 开始拆分;若是,直接拆分a[i]=n。
② 对a[i-1] 或a[i] 进行二次拆分,二次拆分就相当于再进行一次拆分。
③ 做完①②步之后2(7)就被完整的拆分成2(2(2)+2+2(0))形式,此时只需要继续拆分 [n-a[i-1] 或n-a[i] ]即可得到+2(3)+2(0)。
细节:为防止2被拆分成2(0)形式,需要判断a[i]或a[i-1]==2,若是,不再对2进行二次拆分。

代码:

#include <iostream>
using namespace std;
int a[16]={
   1,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值