noip1998 幂方分解 (模拟)

本文介绍了一个正整数的幂方分解方法,通过递归将任意正整数转换为2的幂次方形式,并给出了实现这一过程的C++代码示例。

A1116. 幂方分解
时间限制: 1.0s   内存限制: 256.0MB  
总提交次数: 445   AC次数: 288   平均分: 71.82
将本题分享到:
       
   
试题来源
  NOIP1998 普及组
问题描述
  任何一个正整数都可以用2的幂次方表示。例如:
  137=2 7+2 3+2
  同时约定方次用括号来表示,即a b 可表示为a(b)。
  由此可知,137可表示为:
  2(7)+2(3)+2(0)
  进一步:7= 2 2+2+2 (2 1用2表示)
  3=2+2
  所以最后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表示(在表示中不能有空格)


    解析:模拟。

    代码:

    #include<cstdio>
    using namespace std;
    
    inline void resolve(int x)
    {
      int i,j,k; 
      for(i=20;i>=0;i--)
        {
          k=1<<i;
          if((~x)&k)continue;
          if(i==1)printf("2");
          if(i==0)printf("2(0)");
          if(i>1)
            {
              printf("2(");
              resolve(i);
              printf(")");
            }
          x-=k;
          if(x>0)printf("+");  
        }
    }
    
    int main()
    {
      int n;
      scanf("%d",&n);
      resolve(n);
      return 0;
    }


    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值