概述
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。
将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面,可得到如下表达式:137=27+23+2^0
现在约定幂次用括号来表示,即a^b表示为a(b)
此时,137可表示为:2(7)+2(3)+2(0)
进一步:7=22+2+20 (2^1用2表示)
3=2+2^0
所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:1315=210+28+2^5+2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输入格式
正整数(1<=n<=20000)
输出格式
符合约定的n的0,2表示(在表示中不能有空格)
样例输入
137
样例输出
2(2(2)+2+2(0))+2(2+2(0))+2(0)
样例输入
1315
样例输出
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
提示
用递归实现会比较简单,可以一边递归一边输出
解题思路:
这几天被简单的题目惯坏了,乍一看这道题目还不适应。其实这也是一道比较基础的递归算法题目,只不过这道递归分两层进行。
第一层:每次递归都储存当前的位数和次幂数。
第二层:将次幂数再进行递归,再次分解成用2表示的形式,如果还不满足条件,继续递归直到所有数字都为2或0。
代码如下:
#include<bits/stdc++.h>
using namespace std;
void put(int num,int n){//num为当前数,n为几次方
if(num == 0) return;//结束条件,分解结束
int r=num % 2;//最后一位取出来
num=num / 2;//右移一位
put(num, n + 1);//下一位次方 +1
if(num && r){//前面和当前位非0的时候输出'+'号
cout << "+";
}
if(r){ //当前最后一位 非0 那么输出对应的表示
if(n == 1)
cout << "2";
else{
cout << "2(";
if (n == 0){
cout << "0";
}
else put(n, 0);//次方大于等于2 时,继续分解
cout << ")";
}
}
}
int main(){
int num;
cin >> num;
put(num, 0);//刚开始 最后一位 是0次方
return 0;
}
感谢这位老哥的分享:https://www.cnblogs.com/gongpixin/p/4477355.html
最后
以上就是美丽唇彩为你收集整理的蓝桥杯 2的次幂表示 C++算法训练 HERODING的蓝桥杯之路的全部内容,希望文章能够帮你解决蓝桥杯 2的次幂表示 C++算法训练 HERODING的蓝桥杯之路所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复