我们知道,二进制与十进制是不一样的(废话……)。对于一位二进制运算,在不考虑借位时,加法和减法实际上都是异或运算:1⊕1=0,0⊕1=1⊕0=1,0⊕0=0。这样我们就可以定义如下一种在二进制串上的加法与减法:
类似我们可以定义如下的的除法运算,注意每一位商的选择都要求当前的余数最小。
上图中,11010110110000除以10011,余数为1110。现在我们任给定串M和串G(输入保证首位为1)求M除以G所得的余数串。
Input
第一行为一个正整数N,表示为测试数据组数,接下来N行每行给定两个二进制串M和G,长度都不超过100。
Output
Sample Input
3
11010110110000 10011
1100100 1100011
1100100 1100100
Sample Output
1110
111
0
- #include <stdio.h>
- #include <string.h>
- #include <algorithm>
- using namespace std;
-
- char s1[105],s2[105];
- int len1,len2;
-
- int main()
- {
- int t,i,j,k;
- scanf("%d",&t);
- while(t--)
- {
- scanf("%s%s",s1,s2);
- len1 = strlen(s1);
- len2 = strlen(s2);
- for(i = 0; i<len1; i++)
- {
- for(j = 0; j<len1; j++)
- {
- if(s1[j]!='0')break;
- }
- if(len1-j<len2)
- break;
- for(k = j; k<j+len2; k++)
- {
- if(s1[k] == s2[k-j])
- s1[k] = '0';
- else
- s1[k] = '1';
- }
- }
- for(i = 0; i<len1; i++)
- if(s1[i] != '0')
- break;
- for(j = i; j<len1; j++)
- printf("%c",s1[j]);
- if(j == i)
- printf("0");
- printf("\n");
- }
-
- return 0;
- }