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 }
代码有些乱,还请见谅,⁄(⁄ ⁄•⁄ω⁄•⁄ ⁄)⁄
少年向来不知天高地厚,放眼处皆自负才高八斗,
虽是自命风流,倒也坦诚无忧,
我爱这样的少年
谦和而狂妄,骄傲又坦诚。
标签:01,二进制,--,len,ch,int,num,操作,scanf From: https://www.cnblogs.com/smiling-weeping-zhr/p/17606489.html