牛客多校(2020第九场)A Groundhog and 2-Power Representation

 

 

 输入

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 }
 
    

 

 
posted @ 2020-08-17 10:35  Mr__wei  阅读(28)  评论(0编辑  收藏  举报