洛谷 P2104 二进制

6 篇文章 0 订阅
6 篇文章 0 订阅

洛谷 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[n]:=chr(ord(s[n])+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[n]:=chr(ord(s[n])-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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值