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

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

3
11010110110000 10011
1100100 1100011
1100100 1100100

Sample Output

1110
111
0
 
  
  
  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <algorithm>  
  4. using namespace std;  
  5.   
  6. char s1[105],s2[105];  
  7. int len1,len2;  
  8.   
  9. int main()  
  10. {  
  11.     int t,i,j,k;  
  12.     scanf("%d",&t);  
  13.     while(t--)  
  14.     {  
  15.         scanf("%s%s",s1,s2);  
  16.         len1 = strlen(s1);  
  17.         len2 = strlen(s2);  
  18.         for(i = 0; i<len1; i++)  
  19.         {  
  20.             for(j = 0; j<len1; j++)  
  21.             {  
  22.                 if(s1[j]!='0')break;  
  23.             }  
  24.             if(len1-j<len2)  
  25.                 break;  
  26.             for(k = j; k<j+len2; k++)  
  27.             {  
  28.                 if(s1[k] == s2[k-j])  
  29.                     s1[k] = '0';  
  30.                 else  
  31.                     s1[k] = '1';  
  32.             }  
  33.         }  
  34.         for(i = 0; i<len1; i++)  
  35.             if(s1[i] != '0')  
  36.                 break;  
  37.         for(j = i; j<len1; j++)  
  38.             printf("%c",s1[j]);  
  39.         if(j == i)  
  40.             printf("0");  
  41.         printf("\n");  
  42.     }  
  43.   
  44.     return 0;  
  45. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值