码题集oj赛(第八次)——MT2179 01操作

一、题目

码题集oj赛(第八次)——MT2179 01操作_第1张图片

二、格式

码题集oj赛(第八次)——MT2179 01操作_第2张图片

三、样例

//输入:
4 10
1101
*/-*-*-/*/
//输出:
10110

注意
码题集oj赛(第八次)——MT2179 01操作_第3张图片

四、代码实现

#include
using namespace std;
const int N = 5e7 + 7;
int n, m;
char a[N], c;
int main() {

	cin>>n>>m>>a;

	while(m--) {
		cin >> c;
		switch(c){
			case '+': {
				for(int i = n-1; i >= 0; i--)
				{
					if(a[i] == '0') {
						a[i] = '1';
						break;
					}
					else {
						a[i] = '0';
					}
				}
				break;
			}
			case '-': {
				for(int i = n-1; i >= 0; i--)
				{
					if(a[i] == '1') {
						a[i] = '0';
						break;
					} 
					else {
						a[i] = '1';
					}
				}
				break;
			}
			case '*': {
				a[n] = '0';
				a[++n] = '\0';
				break;
			}
			case '/': {
				a[--n] = '\0';
				break;
			}
		}
	}	
	
	cout << a;
	
	return 0;
} 

五、讲解视频

码题集oj赛(第八次)——MT2179 01操作

总结

本题目对于基础牢固的同学来讲十分简单,但是对于什么也不会类型的同学来说还是有点小难度的。
首先,题目中给了四种操作,分别是‘+’、‘-’、‘*’、‘/’
其中,'+'和'-'操作直接就能看懂。但是'*'和'/'操作是要求原二进制数乘以2,那么转换一下就是'*'就是将二进制数左移一位;而'/'操作就是将二进制数右移一位。
同时,这里采用了一种非常简便的方法来实现‘*’、‘/’操作,如果是‘*’的话,因为是左移一位,所以直接在字符串的最后面加上一个'0',然后为了确保万一,我们再在后面添加'\0'来终止字符串。同理,‘/’操作是右移一位,相比左移更加简单,直接把字符串最后一个字符给删了即可,这里还是使用'\0'提前一位终止字符串来实现该操作。

你可能感兴趣的:(算法,算法)