如何解决此问题中的SIGSEGV ERROR?

时间:2019-12-08 07:21:26

标签: segmentation-fault

添加

最近,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;
}

3 个答案:

答案 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;
}