1. 程式人生 > >【題解】二進制取模

【題解】二進制取模

write har gis compare etc turn 程序 splay cstring

題目描述

兩個二進制數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; }
參考程序

【題解】二進制取模