我是靠谱客的博主 美丽唇彩,最近开发中收集的这篇文章主要介绍蓝桥杯 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

最后

以上就是美丽唇彩为你收集整理的蓝桥杯 2的次幂表示 C++算法训练 HERODING的蓝桥杯之路的全部内容,希望文章能够帮你解决蓝桥杯 2的次幂表示 C++算法训练 HERODING的蓝桥杯之路所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部