【题解】二进制取模

题目描述

        两个二进制数n%m的结果是多少?

输入输出格式

输入格式

       两行,第一行输入一个二进制数n;第二行输入一个二进制数m。

输出格式

        一行,输出n%m的结果。

输入输出样例

输入样例

1010101010

111000

输出样例

1010

说明

数据规模

        n的长度(二进制数的位数)≤200000;

        m的长度(二进制数的位数)≤20。

题解

        模拟,主要是一些优化的小技巧可以注意。

#include <cstdio>
#include <cstring>

char a[200005], b[25];
int len_a, len_b;

void Read(char s[], int & len)
{
    char ch = getchar();
    while(ch != '1') ch = getchar();
    s[0] = '0';
    s[1] = ch;
    scanf("%s", s + 2);
    len = strlen(s);
    return;
}

bool Compare(int idx)
{
    for(register int i = idx - len_b + 1, j = 0; i <= idx; ++i, ++j)
    {
        if(a[i] != b[j]) return a[i] > b[j];
    }
    return true;
}

void Minus(int idx)
{
    for(register int i = idx, j = len_b - 1; j >= 0; --i, --j)
    {
        a[i] -= b[j] - '0';
        if(a[i] < '0') a[i] += 2, --a[i - 1];
    }
    return;
}

void Write()
{
    int p = 0;
    while(p + 1 < len_a && a[p] == '0') ++p;
    printf("%s", a + p);
    return;
}

int main()
{
    Read(a, len_a);
    Read(b, len_b);
    for(register int i = len_b - 1; i < len_a; ++i)
    {
        if(Compare(i)) Minus(i);
    }
    Write();
    return 0;
}
参考程序

猜你喜欢

转载自www.cnblogs.com/kcn999/p/10354832.html
今日推荐