华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1363|回复: 1
打印 上一主题 下一主题

2的幂分解(NOIP1998)

[复制链接]

61

主题

147

帖子

563

积分

超级版主

Rank: 8Rank: 8

积分
563
跳转到指定楼层
楼主
发表于 2015-10-31 23:54:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 diggersun 于 2015-11-1 00:05 编辑

任何一个正整数都可以用2的幂次方表示.例如:137=2^7+2^3+2^0同时约定次方用括号来表示,即a^b可表示为a(b)由此可知,137可表示为:2(7)+2(3)+2(0)进一步:7=2^2+2+2^0 (2^1用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<=20000)输出:符合约定的n的0,2表示(在表示中不能有空格)


  1. #include<iostream>
  2. using namespace std;
  3. void mysearch(int i)
  4. {   int r,s;
  5.     if (i==1) cout<<"2(0)";
  6.     else if (i==2) cout <<'2';
  7.     else if (i>2)
  8.     {
  9.         s=2;
  10.         r=0;
  11.         while (i>=s)
  12.         {
  13.             s=s*2;
  14.             r++;
  15.         }
  16.         cout<<"2(";
  17.         mysearch(r);
  18.         cout<<')';
  19.         s=s/2;
  20.         if (i-s>0)
  21.         {
  22.             cout<<'+';
  23.             mysearch(i-s);
  24.         }
  25.     }
  26. }
  27. int main()
  28. {
  29.     mysearch(100);return 0;
  30. }
复制代码
回复

使用道具 举报

61

主题

147

帖子

563

积分

超级版主

Rank: 8Rank: 8

积分
563
沙发
 楼主| 发表于 2015-11-1 00:03:50 | 只看该作者
这个题考虑用递归来做,那么递归有两个出口,一个是1,一个是2,其他的数字都可以化成2^X1+2^X2+2^X3+***的形式,
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 08:21 , Processed in 0.255869 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表