洛谷 P2104 二进制
2017-06-04 18:53
134 查看
洛谷 P2104 二进制
题目
题目描述小Z最近学会了二进制数,他觉得太小的二进制数太没意思,于是他想对一个巨大二进制数做以下 4 种基础运算:
运算 1:将整个二进制数加 1
运算 2:将整个二进制数减 1
运算 3:将整个二进制数乘 2
运算 4:将整个二进制数整除 2
小Z很想知道运算后的结果,他只好向你求助。
(Ps:为了简化问题,数据保证+,-操作不会导致最高位的进位与退位)
输入输出格式
输入格式:
第一行两个正整数 n,m,表示原二进制数的长度以及运算数。
接下来一行 n 个字符,分别为‘0’或‘1’表示这个二进制数。
第三行 m 个字符,分别为‘+’,‘-’,‘*’,‘/’,对应运算 1,2,3,4。
输出格式:
一行若干个字符,表示经过运算后的二进制数。
输入输出样例
输入样例#1:
4 10 1101 */-*-*-/*/
输出样例#1:
10110
说明
【数据规模和约定】
对于 30%的数据,1 ≤ n,m ≤ 1000。
对于 60%的数据,1 ≤ n,m ≤ 10^5。
对于 100%的数据,1 ≤ n,m ≤ 5*10^6。
题解
分治+字符串‘+’:就把最后一个数+1,若变成了’2’那么就把它变成’0’并往前进位
‘-‘:就从最后一个数开始数起,直到遇到’1’为止,中途所遇的每个数都变成’1’
‘*’:在字符串末尾增加一个’0’
‘/’:将字符串最后一位删除
代码(Pascal)
var n,m:longint; s,s1:ansistring; procedure init; begin readln(n,m); readln(s); readln(s1); end; procedure main; var i,t:longint; begin for i:=1 to m do begin if s1[i]='+' then begin s :=chr(ord(s )+1); t:=n; while s[t]='2' do begin if t=0 then begin if s[t]='2' then s[t]:='0'; s:='1'+s; break; end; s[t]:='0'; s[t-1]:=chr(ord(s[t-1])+1); dec(t); end; end else if s1[i]='-' then begin s :=chr(ord(s )-1); t:=n; while s[t]='/' do begin s[t]:='1'; s[t-1]:=chr(ord(s[t-1])-1); dec(t); end; end else if s1[i]='*' then s:=s+'0' else if s1[i]='/' then delete(s,length(s),1); n:=length(s); end; end; procedure print; begin writeln(s); end; begin init; main; print; end.
相关文章推荐
- 洛谷 P1633 二进制
- 洛谷 P1062 数列[解法二:二进制]
- 洛谷 P1782 旅行商的背包(二进制优化下的DP)
- 洛谷P1582 倒水 二进制运算
- 洛谷1633 二进制
- XML中嵌入二进制数据的三种方式
- 我的 FPGA 学习历程(06)—— 二进制转格雷码
- 20161208计算机科学导论02_二进制运算
- 洛谷 1396 营救
- 洛谷 P3622 [APIO2007]动物园【状压dp】
- C语言二进制文件和文本文件的区别
- js,二进制转换保存到数据库及读取二进制图片
- 洛谷 P1739 表达式括号匹配
- 二进制中1的个数
- 洛谷P3245 [HNOI2016]大数 【莫队】
- 每日学习总结:DropDownList是否已选择验证、存储过程参数为sql字符串问题、将截断字符串或二进制数据。\r\n语句已终止
- c语言:获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
- [洛谷P2678]跳石头题解
- lintcode:二进制中有多少个1
- 洛谷 P1016 旅行家的预算