2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)
输出
1315
题解:
直接附上代码,注释非常清晰
1 #include<iostream> 2 #include<cstring> 3 #include<string> 4 #include<algorithm> 5 6 using namespace std; 7 8 #define ll long long 9 10 int ans[200], alen = 0; //结果和结果的长度 11 int b[1005]; //temp数组 12 int p; //更新i的工具 13 char s[20005]; 14 int k; //存储字符串数组及其长度 15 16 void add(int b[], int len) {//高精度加 17 alen = max(alen, len); //b的长度和ans长度取最大值 18 for (int i = 1; i <= alen; i++) { 19 ans[i] += b[i]; 20 ans[i+1] += ans[i] / 10; 21 ans[i] %= 10; 22 } 23 if (ans[alen+1]) alen++; //如果最高位有进位,则长度++ 24 } 25 26 void mi(ll n) { //2的高精度幂 27 memset(b, 0, sizeof(b)); 28 b[1] = 1; 29 int len = 1; 30 for (int i = 1; i <= n; i++) { 31 int temp = 0; //进位 32 33 //相当于一次ans * 2, n次幂,所以i循环n次 34 for (int j = 1; j <= len; j++) { 35 b[j] = b[j] * 2 + temp; 36 temp = b[j] / 10; 37 b[j] %= 10; 38 if (temp != 0 && j == len) len++; //如果最高位有所进位,那么长度加1,多进行一次循环 39 } 40 } 41 42 add(b, len); //计算的结果需要加到ans结果中 43 } 44 45 ll ksm (ll a, ll b) { //普通快速幂 46 ll ans = 1; 47 for (; b; b >>= 1) { 48 if (b & 1) ans *= a; //b为奇数,先进行一次乘 49 a *= a; 50 } 51 return ans; 52 } 53 54 ll dfs(ll start, ll num_kuo) { 55 ll sum = 0; 56 p = 0; 57 // p = start; 58 for (int i = start; i < k; i++) { 59 p = max(p, i); //每次更新一下p 60 if (s[i] == '(') num_kuo++; 61 if (s[i] == ')') num_kuo--; 62 if (!num_kuo) { //如果括号结束 63 mi(sum); //那么对sum进行一次高度幂 64 return 0; 65 } 66 if (s[i] == ')') return ksm(2, sum); //如果是括号里的括号,那么使用普通快速幂就可 67 if (s[i] == '2') { 68 if (s[i+1] == '(') { 69 sum += dfs(i+1, num_kuo); 70 i = p; 71 } 72 else 73 sum += 2; 74 } 75 } 76 } 77 78 int main() { 79 scanf("%s", s); 80 k = strlen(s); 81 for (int i = 0; i < k; i++) { 82 if (s[i] == '2') { 83 if (s[i+1] != '(') { //如果i+1不是括号,代表仅有2,那便直接加2 84 memset(b, 0, sizeof(b)); 85 b[1] = 2; 86 add(b, 1); 87 } 88 else { 89 dfs(i+1, 0); 90 i = p; //递归完需要借助p来更新i 91 } 92 } 93 } 94 95 for (int i = alen; i >= 1; i--) { 96 printf("%d", ans[i]); 97 } 98 return 0; 99 }