2的次幂表示 ----递归算法

问题描述

  任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001。

  将这种2进制表示写成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)

输入格式

  正整数(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#, 递归,看着很乱,实际上只要是有一个好的思路依然可以很简单的解出来。

这里我用j=n%2;来求出所输入的2#形式。

接着把次幂分为几类,首先是2(0) , 2(1)简写成2, 2(2),以及大于2的部分,次幂小于2直接输出,

大于二的部分接着递归,知道求出对应的最小的0, 1, 2次幂。

下面是代码:

 

#include <iostream>

#include <cstdio>

using namespace std;

void DiGui(int n)

{

int num = 0, i = 0, j = 0, k = 0, a[32];

//这里的a[32]是因为最大的数位可以用2的32次幂表示。因此这些足够了。

while(n)

{

j = n % 2;

if(j == 1)

a[num++] = i;

i++;

n/=2;

}

for(i = num - 1; i >= 0; i--)

{

if(a[i] == 0)

cout<<"2(0)";

else if(a[i] == 1)

cout<<"2";

else if(a[i] == 2)

cout<<"2(2)";

else if(a[i] > 2)

{

cout<<"2(";

DiGui(a[i]);

cout<<")";

}

if(i != 0)

cout<<"+";

}

}

int main()

{

int n;

while(scanf("%d", &n) != EOF)

{

DiGui(n);

cout<<endl;

}

return 0;

}

时间: 2024-11-08 14:29:37

2的次幂表示 ----递归算法的相关文章

POJ-1001 求高精度幂

[题目描述] 给定R与n,求Rn的精确值,其中(0.0<R<99.99, n为整数0<n<=25). [思路分析] 1. 存储结构 由于R最大不超过100,n不会超过25,故Rn不会超过50位,保险起见采用100位的int数组.数组采用与字符串的逆序方式存储,即str=”123456”中str[0]=’1’而存入int数组后,int[0]=’6’.因此,在输入时候,可以通过字符串的字符个数以及是否存在小数点来判断这个数字的位数,根据位数从最高位(str[0])开始存储数字.这样虽然

hdu Code Lock

题意是说有N个字母组成的密码锁, 如[wersdfj],   每一位上的字母可以转动, w可转动变成x, z变成a.但是题目规定, 只能同时转动某个区间上的所有字母, 如[1,3], 那么第1到第3个的所有字母要同时转动,那么[ wersdfj ]经过一次操作就变成 [ xfssdfj ].    一共有M 个区间是可以操作的. 题目还规定:If a lock can change to another after a sequence of operations, we regard them

2的次幂表示【递归算法训练】

[一个比较经典的算法题目] 题目链接:http://lx.lanqiao.org/problem.page?gpid=T235 问题描述 任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001. 将这种2进制表示写成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 

算法学习笔记 递归之 快速幂、斐波那契矩阵加速

递归的定义 原文地址为:http://blog.csdn.net/thisinnocence 递归和迭代是编程中最为常用的基本技巧,而且递归常常比迭代更为简洁和强大.它的定义就是:直接或间接调用自身.经典问题有:幂运算.阶乘.组合数.斐波那契数列.汉诺塔等.其算法思想: 原问题可分解子问题(必要条件): 原与分解后的子问题相似(递归方程): 分解次数有限(子问题有穷): 最终问题可直接解决(递归边界): 对于递归的应用与优化,直接递归时要预估时空复杂度,以免出现用时过长或者栈溢出.优化递归就是以

更快的求整数幂算法

相信整数幂运算作为一个算法演变的例子是再合适不过的了为了节省访客们宝贵的学习时间省去介绍递归等可能涉及到的初级概念的定义.同时如果发现文中有错误的地方请敞开衣服指正. 因为在测试性能时合适的测试数据是必要的,所以本文用C++的大数类进行演示. 点击获取C++大数类源码 这里我们先列一下会提到的算法分析技术: 动态规划 减治法 测试平台: Linux g++ 4.7 原始递归方法 这就不花时间赘述什么了. BigInteger pow(BigInteger x, int N) { if (N ==

北京大学Online Judge 之 “求高精度幂(ID1001)”解题报告

北京大学Online Judge 之 "求高精度幂(ID1001)"解题报告 巧若拙(欢迎转载,但请注明出处:http://blog.csdn.net/qiaoruozhuo) 题目描述: Description 对数值很大.精度很高的数进行高精度计算是一类十分常见的问题.比如,对国债进行计算就是属于这类问题. 现在要你解决的问题是:对一个实数R( 0.0 < R <99.999 ),要求写程序精确计算 R 的 n 次方(Rn),其中n 是整数并且 0 < n <

算法笔记01--归纳法之整数幂

整数幂 算法1:对实数x的n次幂设计一个有效的算法.一种直接的方法是对x用迭代方法自乘n次,这种方法十分低效,因为它需要O(n)乘法.一个高效的方法可以用如下方法推出,令m=n/2,假设已经知道如何计算x^m.那么有两种情况:如果n是偶数,那么x^n = (x^m)^2:否则x^n = x(x^m)^2. 算法2:令n的二进制表示为dn-1.....d1,d0.从y=1开始,由n的高位至地位扫描,如果二进制数字为0,就对y平方:如果为1就对y平方并乘x.这就产生了递归算法EXPREC. 时间复杂

快速求幂运算

1 #include <stdio.h> 2 #include <math.h> 3 //递归算法 4 int recursion(int a,int b) 5 { 6 int tem = 1; 7 if(b==0)return 1; 8 else if(b==1)return a; 9 tem = recursion(a,b>>1); 10 tem = tem*tem; 11 if(b&1) tem = tem * a; 12 return tem; 13 }

矩阵快速幂刷题系列

来源自http://blog.csdn.net/chenguolinblog/article/details/10309423 hdu 1575 Tr A Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5587    Accepted Submission(s): 4200 Problem Description A为一个方阵,则Tr