#147-(EZOI练习)【递归】幂次方表示法

xiaoxiao2022-07-06  6


某平台价值19860元的编程课程资料免费领取【点我领取】


Description

任何一个正整数都可以用2的幂次方表示。例如:137=27+23+20。同时约定方次用括号来表示,即ab可表示为a(b)。由此可知,137可表示为:2(7)+2(3)+2(0),进一步:7= 2(2)+2+2(0),(21用2表示)3=2+2(0) ,所以最后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表示(在表示中不能有空格)

Sample Input

1315

Sample Output

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

直接递归.

#include <iostream> #include <cmath> using namespace std; void doit(int x) { int k = -1, i, temp; bool flag = false; if (x == 2) // 两个边界条件 { printf("2"); return; } if (x == 1) { printf("2(0)"); return; } temp = x; while (temp) { ++k; temp >>= 1; } temp = pow(2, k); for (i = k; ~i; --i) { if (!i) // 特判 { temp = 1; } if (x & temp) // 巧妙运用&运算符 { if (flag) { printf("+"); } flag = true; if (i == 1) { printf("2"); continue; } printf("2("); if (i) { doit(i); // 递归 } else { printf("0"); } printf(")"); } temp >>= 1; } return; } int main(void) { int x; scanf("%d", &x); doit(x); return 0; }

 

转载请注明原文地址: https://www.6miu.com/read-4968558.html

最新回复(0)