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 
  所以最后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)
提示
  用递归实现会比较简单,可以一边递归一边输出

分析:

本题可以参考一个算法:递归输出某十进制数的二进制表示的算法。(主要是在递归回溯的时候才输出,而非计算出来就输出。)

本着从易到难的原则,可以考虑先实现将137表示为:2(7)+2(3)+2(0)的程序。

关于加号的输出:可以考虑判断当前项是否二进制序列的最高位(传入下一层的数是0)。是最高位则当前项左侧不输出“+”,否则在当前项左侧输出“+”.

关于把指数也转变为0和2的序列:在输出每一项时判断指数是否超过1,超过则先输出“2(”,然后把该指数与0传入递归函数,递归显示该指数的表示。然后在输出后半边括号。

程序一:实现将137表示为:2(7)+2(3)+2(0)的程序.

 1 #include <stdio.h>
 2 void toBinary(int n,int x);
 3 int main()
 4 {
 5     int n;
 6     freopen("out1.txt","w",stdout);
 7     n=1;
 8     while(n<=255)
 9     {
10         //scanf("%d",&n);
11         printf("%d---->",n);
12         toBinary(n,0);
13         printf("\n");
14         n++;
15     }
16
17     return 0;
18 }
19 void toBinary(int n,int x)
20 {
21     int t;
22     if(n==0)
23         return;
24     else
25     {
26         t=n%2;
27         toBinary(n/2,x+1);
28         if(t)
29         {
30             if(x==1)
31             {
32                 if(n/2==0)
33                     printf("2");
34                 else printf("+2");
35             }
36             else
37             {
38                 if(n/2==0)
39                     printf("2(%d)",x);
40                 else printf("+2(%d)",x);
41             }
42         }
43     }
44 }

程序二:完整程序的实现。

 1 #include <stdio.h>
 2 void toBinary(int n,int x);
 3 int main()
 4 {
 5     int n;
 6     /*scanf("%d",&n);
 7     toBinary(n,0);*/
 8
 9     freopen("out2.txt","w",stdout);
10     n=1;
11     while(n<=255)
12     {
13         //scanf("%d",&n);
14         printf("%d---->",n);
15         toBinary(n,0);
16         printf("\n");
17         n++;
18     }
19
20     return 0;
21 }
22 void toBinary(int n,int x)
23 {
24     int t;
25     if(n==0)
26         return;
27     else
28     {
29         t=n%2;
30         toBinary(n/2,x+1);
31         if(t)
32         {
33             if(x==1)
34             {
35                 if(n/2==0)
36                     printf("2");
37                 else printf("+2");
38             }
39             else
40             {
41                 if(n/2==0)
42                 {
43                     //printf("2(%d)",x);
44                     if(x==0) printf("2(0)");
45                     else
46                     {
47                         printf("2(",x);
48                         toBinary(x,0);
49                         printf(")");
50                     }
51                 }
52                 else
53                 {
54                     //printf("+2(%d)",x);
55                     if(x==0) printf("+2(0)");
56                     else
57                     {
58                         printf("+2(",x);
59                         toBinary(x,0);
60                         printf(")");
61                     }
62                 }
63             }
64         }
65     }
66 }
时间: 2024-11-12 07:22:37

2的次幂表示【递归算法训练】的相关文章

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+

Poj 3233 矩阵快速幂,暑假训练专题中的某一道题目,矩阵快速幂的模板

题目链接  请猛戳~ Description Given a n × n matrix A and a positive integer k, find the sum S = A + A2 + A3 + - + Ak. Input The input contains exactly one test case. The first line of input contains three positive integers n (n ≤ 30), k (k ≤ 109) and m (m <

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的次幂表示

算法训练 2的次幂表示 时间限制:1.0s   内存限制:512.0MB 问题描述 任何一个正整数都可以用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))+

1501102328-蓝桥杯-算法训练 2的次幂表示

算法训练 2的次幂表示 时间限制:1.0s   内存限制:512.0MB 问题描述 任何一个正整数都可以用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

hdu 4965 Fast Matrix Calculation(矩阵快速幂)2014多校训练第9场

Fast Matrix Calculation                                                                   Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description One day, Alice and Bob felt bored again, Bob knows Ali

19-算法训练 2的次幂表示

算法训练 2的次幂表示 时间限制:1.0s   内存限制:512.0MB 问题描述 任何一个正整数都可以用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进制表示,例如: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