问题描述 任何一个正整数都可以用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(N<=20000),为要求分解的整数。 输出格式 程序输出包含一行字符串,为符合约定的n的0,2表示(在表示中不能有空格)
题目分析:这道题,没什么技巧,就是一道模拟题吧,很容易看到,就是将一个数按照(2,0)两个数的格式输出,递归实现。
需要注意一点,当输出2的时候千万不要输出2(2(0)),这样形成累赘,虽然也是对的,但就与原答案不符合了。
贴上代码:
1 #include<stdio.h> 2 #include<string.h> 3 int mi[15]={1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384}; 4 int zs[15]={1,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; 5 void f(int n) 6 { 7 if(n==1){printf("2(0)");return ;} 8 if(n==2) {printf("2");return ;} 9 int i=14,j=n; 10 while(i>=1){ 11 if(j-mi[i]>=0){ 12 printf("2"); 13 if(zs[i]>1){ 14 printf("("); 15 f(zs[i]); 16 printf(")"); 17 } 18 j-=mi[i]; 19 if(j) printf("+"); 20 f(j);return ; 21 } 22 i--; 23 } 24 } 25 int main() 26 { 27 int n;scanf("%d",&n); 28 f(n); printf("\n"); 29 return 0; 30 }