添加
最近,Chef研究了二进制数字系统,并注意到对非负整数执行诸如AND,XOR或位移位之类的按位运算极其简单,而对算术运算(例如加法,乘法)进行运算则要复杂得多。或除法)。
使用二进制运算一段时间后,Chef发明了一种有趣的算法,用于将两个非负整数A和B相加:
函数add(A,B):当B大于0时:U = A XOR B V = A AND B A = U B = V * 2 return A现在厨师想知道该算法有多快。给定A和B的初始值(以二进制表示),他需要您帮助他计算算法的while循环重复的次数。
输入输入的第一行包含一个整数T,表示测试用例的数量。 T测试用例的描述如下。每个测试用例的第一行包含一个字符串A。第二行包含一个字符串B。输出对于每个测试用例,请打印包含一个整数的一行-算法将在给定数字相加期间执行的迭代次数A和B。
约束1≤T≤1051≤| A |,| B |≤105A和B仅包含字符'0'和'1',| A | + | B |之和所有测试用例的总和不超过106个子任务子任务1(20分):| A |,| B |≤30子任务2(30分):
| A |,| B |≤500| A | + | B |之和在所有测试用例中均不超过105个子任务#3(50分):原始约束
示例输入3 100010 0 0 100010 11100 1010示例输出0 1 3解释示例情况1:B的初始值为0,因此根本不执行while循环。
示例情况2:A和B的初始值分别为02 = 0和1000102 = 34。第一次执行while循环时,我们有:
U = 34 V = 0 A更改为34 B更改为2⋅0= 0。while循环此后立即终止,因此仅执行一次。
示例情况3:A和B的初始值分别为111002 = 28和10102 = 10。第一次迭代后,它们的值分别变为22和16。在第二次迭代后,它们更改为6和32,最后在第三次迭代后,更改为38和0。
我的解决方案:-
#include<bits/stdc++.h>
using namespace std;
int main()
{
int i,k,count,t;
char A[20],B[20];
int a,b,u,v;
scanf("%d",&t);
while(t--)
{
int sum;
a=0; b=0;
fflush(stdin);
cin>>A;
fflush(stdin);
cin>>B;
for(i=0;i<strlen(A);i++)
{
a=a*2+A[i]-48;
}
//cout<<"a="<<a<<endl;
for(i=0;i<strlen(B);i++)
{
b=b*2+B[i]-48;
}
sum=a+b;
//cout<<"b="<<b<<endl;
for(k=0;b>0;k++)
{
u=a^b;
a=u;
b=sum-a;
//cout<<a<<b<<endl;
}
cout<<k<<endl;
}
return 0;
}
答案 0 :(得分:0)
只需增加字符数组的大小即可,只需将其更改为200001
答案 1 :(得分:0)
t=int(input())
while(t!=0):
A=int(input(),2)
B=int(input(),2)
c=0
while(B>0):
U = A^B
V = A&B
A = U
B = V*2
c=c+1
print(c)
t-=1
答案 2 :(得分:0)
我尝试过蛮力,但是没有用,这是我的代码
int main() {
int t;
cin>>t;
while(t--)
{
string stra,strb;
long int a=0,b=0;
fflush(stdin);
cin>>stra;
fflush(stdin);
cin>>strb;
for(std::string::size_type i=0;i<stra.size();i++)
{
int ax=stra[i];
ax-=48;
a+=ax*pow(10,stra.size()-i-1);
}
for(std::string::size_type i=0;i<strb.size();i++)
{
int bx=strb[i];
bx-=48;
b+=bx*pow(10,strb.size()-i-1);
}
long int runtime=0;
while(b>0)
{
long int V,U;
U = a ^ b;
V = a & b;
a = U;
b = V * 2;
runtime++;
}
cout<<runtime<<endl;
}
return 0;
}