链接: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)
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 }