2333 - 二的幂次方
时间限制 : 1 秒
内存限制 : 125 MB
任何一个正整数都可以用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表示。(在表示中不能有空格)
输入/输出样例
输入格式
137
输出格式
2(2(2)+2+2(0))+2(2+2(0))+2(0)
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); }
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; }
Java解答
import java.util.Scanner; public class Main { public static void main(String[] args) { String str = ""; Scanner scan = new Scanner(System.in); int num = scan.nextInt(); scan.close(); String res = doWhile(num, str); System.out.println(res); } private static String doWhile(int num, String str) { int product = 1, n = 0; if (num == 1) { return "2(0)"; } else if (num == 2) { return "2"; } while (product * 2 <= num) { product *= 2; ++n; } if (num - product != 0) { int diff = num - product; str = "2(" + doWhile(n, str) + ")+" + doWhile(diff, str); } else { str = "2(" + doWhile(n, str) + ")"; } str = str.replace("2(2(0))", "2"); return str; } }