2的幂次方表示题解
来源:互联网 发布:焊缝作图软件 编辑:程序博客网 时间:2024/05/29 13:20
8758:2的幂次方表示
总时间限制:
1000ms
内存限制:
65536kB
描述
任何一个正整数都可以用2的幂次方表示。例如:
137=27+23+20
同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7=22+2+20(21用2表示)
3=2+20
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=210+28+25+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表示(在表示中不能有空格)。
样例输入
137
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
来源
NOIP1998复赛 普及组 第一题
题解:将一个大数拆分为若干个2的n次方的和,并且将次方和再拆分成若干个部分,这样很容易就可以想起递归算法。
实际上问题大致分为两步:
1. 将数字分解为2的n次方
2. 将n再次分解为2的n次方(调用自身,如果n==2则结束printf(“2”);
如果n==1 则printf(“2(0)”);)
#include<stdio.h>#include<stdlib.h>#include<string.h>#include<math.h>void work(int n){if(n==1)//初始判断条件,如果n为1或2则直接输出 {printf("2(0)");return;}else if(n==2){printf("2");return; } else{int j=1,i=0;//j每次乘2,如果大于了n就分解结束,i为当前次数 do{j*=2;if(j>n){j/=2;if(i==1)//这步非常重要,确定是否需要继续 2() printf("2");else{printf("2(");work(i);printf(")");}if(n-j!=0)//如果n分解之后还有剩余的数,那么继续分解 {printf("+");work(n-j);}return;}elsei++;}while(1);}}int main(){int n;scanf("%d",&n);work(n);}
0 0
- 2的幂次方表示题解
- 2的幂次方表示题解
- 2的幂次方表示题解
- 2的幂次方表示
- 2的幂次方表示
- 2的幂次方表示
- 2的幂次方表示
- 2的幂次方表示
- 2的幂次方表示
- 递归之 2的幂次方表示
- openJudge 2的幂次方表示
- 百练:2的幂次方表示
- openjudge :2的幂次方表示
- CCF NOI1074 2的幂次方表示
- 2的幂次方表示()
- NOIP1998复赛:2的幂次方表示
- 递归-2的幂次方表示
- Java:2的幂次方表示
- C++调用C函数
- 中文字符编码标准、Unicode、Code Page
- Method Parameters And Type Conversion
- ZMQ源码分析(五) --TCP通讯
- vs中release模式下assert中的代码不执行
- 2的幂次方表示题解
- stmp批量发送email包括图片和附件
- 浏览器缓存知识小结及应用
- Request Header在网页端和API中的区别与联系
- 2012年第三届蓝桥杯C/C++程序设计本科B组省赛 古堡算式(结果填空)
- 使用GENBANK数据进行分子系统发育树的构建
- 保罗.格雷厄姆:如何获得创业Ideas | How to Get Startup Ideas
- memcached CAS协议
- 【java web】--JSP model1和model2的联系和区别