蓝桥杯 2的次幂表示 C++算法训练 HERODING的蓝桥杯之路

资源限制
时间限制: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

猜你喜欢

转载自blog.csdn.net/HERODING23/article/details/106185157