zoukankan      html  css  js  c++  java
  • 牛客多校(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 }
     
         
        
     
  • 相关阅读:
    [WARNING] 找不到编译器:wepy-compiler-less。 [Error] 未发现相关 less 编译器配置,请检查wepy.config.js文件。
    wepy-cli : Failed to download repo standard: getaddrinfo ENOENT raw.githubusercontent.com
    火币Huobi 币安 Binance ios 反编译
    iPhone 反编译-微信多开分身版原理,一部iPhone登录多个微信号
    安卓微信分身版 一部手机同时登录多个微信号 原理
    微信smali反编译 查看撤回消息
    微信抢红包
    Dota2 荒神罪 破解
    微信smali反编译 语音消息转发功能
    mac安装mysql流程
  • 原文地址:https://www.cnblogs.com/mr-wei977955490/p/15367578.html
Copyright © 2011-2022 走看看