BNU4065:二进制串的运算(模拟)

来源:互联网 发布:骑士巡游算法 编辑:程序博客网 时间:2024/06/07 03:01

我们知道,二进制与十进制是不一样的(废话……)。对于一位二进制运算,在不考虑借位时,加法和减法实际上都是异或运算: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

每行输出余数串,不要输出多余的前导0

Sample Input

311010110110000 100111100100 11000111100100 1100100

Sample Output

11101110
 
#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;}

原创粉丝点击