幂次方(递归)

幂次方(递归)

链接:https://ac.nowcoder.com/acm/contest/1069/L

题目描述

任何一个正整数都可以用2的幂次方表示。例如:                  
137=27+23+20         
同时约定方次用括号来表示,即ab可表示为a(b)。
由此可知,137可表示为:
2(7)+2(3)+2(0)
进一步:7=22+2+20(21用2表示)
3=2+20   
所以最后137可表示为:
2(2(2)+2+2(0))+2(2+2(0))+2(0)
又如:
1315=210 +28 +25 +2+1
所以1315最后可表示为:
2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

输入描述:

正整数(n ≤ 20000)

输出描述:

符合约定的n的0,2表示(在表示中不能有空格)

输入

1315

输出

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

 

算法
这道题目的算法就是递归,因为题目中的问题本身具有递归的特征。其实知道了这一点后,直接写一大块递归代码然后不停的debug,加一些if-else判断和循环调上一阵子也是可以过的,但是为了把代码写得清楚一点我还是分析了一下。

分析
137=128+8+1=27+23+20137=128+8+1=27+23+20
7=4+2+1=22+2+207=4+2+1=22+2+20
3=2+13=2+1
从中我们可以看出来一点端倪,这并不是一层递归,而是两个递归结构的互相的,间接的递归,在代码上就反映为两个函数之间的调用与间接递归。
这两个结构分别是
2的幂次方=2^非2的幂次方
非2的幂次方=2的幂次方+2的幂次方+···+2的幂次方
所以写了两个函数mi是输出2的幂次方的,ci是输出非2的幂次方的。

 

格式太难弄了,一直在改格式,看注释就知道了。。蒟蒻瑟瑟发抖

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 #include <string>
 5 #include <math.h>
 6 #include <algorithm>
 7 #include <queue>
 8 const int INF=0x3f3f3f3f;
 9 using namespace std;
10 
11 void mi(int &n);
12 void ci(int i);
13 
14 void ci(int i)
15 {
16     if(i==1)
17     {
18 //        printf(")");
19         return;
20     }    
21     else if(i==0)
22     {
23         printf("0)");
24         return;
25     }
26     else
27     {
28         int cnt=0;
29         while(i)
30         {
31             if(cnt!=0)
32                 printf("+");
33             mi(i);
34 //            printf(")");
35             cnt++;
36         }
37     }
38     printf(")");
39     return ;    
40 }
41 
42 void mi(int &n)
43 {
44     int i;
45     for(i=0;;i++)
46     {
47         if(pow(2,i)>n)
48         {
49             i--;
50             if(i!=1)
51                 printf("2(");
52             else
53                 printf("2");
54             ci(i);
55             n-=pow(2,i);
56 //            printf("2^%d ",i);
57             break;
58         }
59         else if(pow(2,i)==n)
60         {
61             if(i!=1)
62                 printf("2(");
63             else
64                 printf("2");
65             ci(i);
66 //            printf("2(");
67 //            ci(i);
68             n-=pow(2,i);
69 //            printf("2^%d ",i);
70             break;
71         }
72     }
73     return;
74 }
75 
76 int main()
77 {
78     int n;
79     scanf("%d",&n);
80     int cnt=0;
81     while(n)
82     {
83         if(cnt!=0)
84             printf("+");
85         mi(n);
86 //            printf(")");
87         cnt++;
88     }
89 }

 

 

 

 

 

 

posted @ 2019-07-29 03:01  jiamian22  阅读(983)  评论(0编辑  收藏  举报