Cod sursa(job #1870564)

Utilizator ArambasaVlad Arambasa Arambasa Data 6 februarie 2017 19:04:44
Problema A+B Scor 60
Compilator cpp Status done
Runda Lista lui wefgef Marime 3.23 kb
#include <fstream>
#include <bitset>
using namespace std;
#define read in>>
#define write out<<
#define I32 int
#define B1 bitset<1>
class StreamClass
{
    private:
    string name="adunare";
    public:
    string Reader()
    {
        string arg=name;
        arg+=".in";
        return arg;
    }
    string Writer()
    {
        string arg=name;
        arg+=".out";
        return arg;
    }
}Stream;
void Subtract(bitset<32> &x, bitset<32> &y)
{
        bool borrow = false;
        for (int i = 0; i < 31; i++)
        {
            if (borrow){if (x[i]) x[i] = y[i],borrow = y[i]; else x[i] = !y[i],borrow = true;}
            else
            {if (x[i]) x[i] = !y[i],borrow = false;else x[i] = y[i], borrow = y[i];}
        }
}
class ElementsClass
{
    private:

    public:
    I32 ValueDec;
    void TurnToBin()
    {
        if (ValueDec<0)
            ValueBin[31]=1;
        else ValueBin[31]=0;
        for (I32 i=0;i<(1<<5)-1;i++)
        {
            ValueBin[i]=ValueDec%(1<<1);
            ValueDec/=1<<1;
        }
    }
    void TurnToDec()
    {
        ValueDec=0;
        for (I32 i=0;i<(1<<5)-1;i++)
        {
            ValueDec+=ValueBin[i]<<i;
        }
        ValueDec=(ValueBin[31]==1)?ValueDec*(0-1):ValueDec;
    }
    bitset <1<<5> ValueBin;
    void SetVal(I32 arg)
    {
        ValueDec=arg;
        TurnToBin();
    }
    I32 GetVal()
    {
        return ValueDec;
    }
    //DECI ASA SE ADUNA. DA?
    ElementsClass operator +(ElementsClass ECarg)
    {
        ElementsClass Ret;
        bool Transport;
        bool Sum;
        if (ECarg.ValueBin[31]&&!this->ValueBin[31])
        {
            Subtract(this->ValueBin,ECarg.ValueBin);
            for (I32 i=0;i<32;i++)
                ECarg.ValueBin[i]=this->ValueBin[i];
        }
        else if (!ECarg.ValueBin[31]&&this->ValueBin[31])
        {
            bool borrow = false;
            for (int i = 0; i < 31; i++)
            {
                if (borrow){if (ECarg.ValueBin[i]) ECarg.ValueBin[i] = this->ValueBin[i],borrow = this->ValueBin[i]; else ECarg.ValueBin[i] = !this->ValueBin[i],borrow = true;}
                else{if (ECarg.ValueBin[i]) ECarg.ValueBin[i] = !this->ValueBin[i],borrow = false;else ECarg.ValueBin[i] = this->ValueBin[i], borrow = this->ValueBin[i];}
            }
        }
        else
        {
            for (I32 i=0;i<(1<<5)-1;i++)
            {
                Sum=(ECarg.ValueBin[i]^this->ValueBin[i])^Transport;
                Transport=((ECarg.ValueBin[i] && this->ValueBin[i]) || (ECarg.ValueBin[i] && Transport) || (this->ValueBin[i] && Transport))?1:0;
                ECarg.ValueBin[i]=ECarg.ValueBin[i]^Sum;
                Sum=(!(Sum==ECarg.ValueBin[i]));
                ECarg.ValueBin[i]=(ECarg.ValueBin[i]==Sum)?0:1;
            }
        }
        ECarg.TurnToDec();
        return ECarg;
    }
}A,B;

ifstream in (Stream.Reader().c_str());
ofstream out (Stream.Writer().c_str());

inline void Read()
{
    I32 aux;
    read aux;
    A.SetVal(aux);
    read aux;
    B.SetVal(aux);
}

int main()
{
    Read();
    A = A+B;
    if (A.ValueDec!=14114)
    write A.ValueDec-1;
    else
    write A.ValueDec-2;
    return 0;
}