二进制-01操作

发布时间 2023-08-04 17:08:43作者: smiling&weeping

Smiling & Weeping

                    ----听到一些事,明明不相干的,

                      也会在心中拐好几个弯想到你。

 思路:思路就是简单的模拟题,注意一直维护一个len(长度),若是*操作len++; 若是/操作我们就需要分两种操作了:

  • 若num[i] > 0 : num[i-1] += num[i]/2 , num[i] = 0 , len--;      //num[i]初始化为0
  • 若num[i] < 0 : num[i-1] += (num[i]-1)/2 , num[i] = 0 , len++;

最后,再展平即可,操作不细说,看代码相信你一定可以理解(把最高位的1均匀分到之后的每一位,即最后一位加2,除一位的其它位加1),(* ̄︶ ̄)

Talk is cheap , show me the code

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n , m , len;
 4 char num1[50000100] , ch[50000100];
 5 int num[50000100];
 6 int a , b;
 7 int main()
 8 {
 9     scanf("%d%d",&n,&m);
10     len = n;
11     scanf("%s",num1+1);
12     scanf("%s",ch+1);
13     for(int i = 1; i <= n; i++)
14         num[i] = num1[i]-'0';
15     for(int i = 1; i <= m; i++)
16     {
17         if(ch[i] == '*') {len++; }
18         if(ch[i] == '/')
19         {
20             if(num[len] > 1) num[len-1] += num[len]/2;
21             if(num[len] < 0){
22                 num[len-1] += (num[len]-1)/2;
23             }
24             num[len] = 0;
25             len--;
26         }
27         if(ch[i] == '+') num[len]++;
28         if(ch[i] == '-') num[len]--;
29     }
30     for(int i = len; i >= 2; i--)
31     {
32         num[i-1] += num[i]/2;
33         num[i] %= 2;
34     }
35     num[1]--;
36     for(int i = 2; i <= len; i++)
37         num[i]++;
38     num[len]++;
39     for(int i = len; i >= 2; i--)
40     {
41         num[i-1] += num[i]/2;
42         num[i] %= 2;
43     }
44     for(int i = 1; i <= len; i++)
45         printf("%d",num[i]);
46     return 0;
47 }

代码有些乱,还请见谅,⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄

少年向来不知天高地厚,放眼处皆自负才高八斗,

  虽是自命风流,倒也坦诚无忧,

    我爱这样的少年

   谦和而狂妄,骄傲又坦诚。