3784 - 【START】2015暑期训练——2的次幂表示
时间限制 : 1 秒
内存限制 : 128 MB
任何一个正整数都可以用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)
题目输入
输入第一行是一个整数M(0<M<=100),代表测试数据组数
接下来M行每行一个正整数(1<=n<=20000)
题目输出
针对每个输入,输出符合约定的n的0,2表示(在表示中不能有空格),以换行符结束。
输入/输出样例
输入格式
2 137 1315
输出格式
2(2(2)+2+2(0))+2(2+2(0))+2(0) 2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
C语言解答
#include<stdio.h> #include<math.h> void fun(int n) { int i; if(n == 3) printf("2+2(0)"); else if(n == 2) printf("2"); else if(n == 1) printf("2(0)"); else { printf("2("); for(i = 14;i>=0;i--) if((int)pow(2,i)<=n) { fun(i); break; } printf(")"); if(n-(int)pow(2,i)) { printf("+"); fun(n-(int)pow(2,i)); } } } int main() { int t,n; scanf("%d",&t); while(t--) { scanf("%d",&n); fun(n); printf("\n"); } return 0; }
C++解答
#include<iostream> #include<cstdio> using namespace std; void my_print(int n) { int flag = 0; // 标记 // 1 <= n <= 20000 // 2^15次方足够存下所用数字的大小 for(int i = 15; i >= 0; i--) { // 利用位运算方便判断2的次幂数 if(n & (1<<i)) { // 大于2的话需要继续递归 if(flag) cout << "+"; switch(i) { case 0: cout << "2(0)"; break; case 1: cout << "2"; break; case 2: cout << "2(2)"; break; default: cout << "2("; my_print(i); cout << ")"; break; } flag = 1; } } } int main() { int M; cin >> M; while(M--) { int n; // 数字n cin >> n; my_print(n); cout << endl; } return 0; }