2333 - 二的幂次方
任何一个正整数都可以用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)
Input
每个测试文件只包含一组测试数据,每组输入一个正整数n(n<=20000)。
Output
对于每组输入数据,输出符合约定的n的0,2表示。(在表示中不能有空格)
Examples
Input
137
Output
2(2(2)+2+2(0))+2(2+2(0))+2(0)
Solution C
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> void work(int n) { if(n==1)//初始判断条件,如果n为1或2则直接输出 { printf("2(0)"); return; } else if(n==2) { printf("2"); return; } else { int j=1,i=0;//j每次乘2,如果大于了n就分解结束,i为当前次数 do { j*=2; if(j>n) { j/=2; if(i==1)//这步非常重要,确定是否需要继续 2() printf("2"); else { printf("2("); work(i); printf(")"); } if(n-j!=0)//如果n分解之后还有剩余的数,那么继续分解 { printf("+"); work(n-j); } return; } else i++; }while(1); } } int main() { int n; scanf("%d",&n); work(n); }
Solution C++
#include<iostream> #include<cstdio> #include<cmath> using namespace std; void print(int n) { int p=0; while((1<<p)<=n) p++; p--; if(p==0) printf("2(0)"); else if(p==1) printf("2"); else { printf("2("); print(p); printf(")"); } int remain=n-(1<<p); if(remain) { printf("+"); print(remain); } } int main() { int n; while(~scanf("%d",&n)) { print(n); printf("\n"); } return 0; }