Cod sursă (job #403461)

Utilizator avatar alex2209alex Pavel Alexandru alex2209alex IP ascuns
Problemă Sqrt (clasele 9-10) Compilator cpp | 2,82 kb
Rundă Arhiva de probleme Status evaluat
Dată 19 nov. 2018 17:53:40 Scor 100
#include <fstream>
#include <math.h>
using namespace std;
ifstream f("sqrt.in");
ofstream g("sqrt.out");
const int N=3010;
short int m[4][2*N];
char v[N];
int p[4],u[4],nv;
bool Maimic(int a,int b)
{
    if(u[a]<p[a])
    {
        return 1;
    }
    while(p[a]<=u[a] && m[a][p[a]]==0)
    {
        p[a]++;
    }
    while(p[a]<=u[a] && m[b][p[b]]==0)
    {
        p[b]++;
    }
    if(u[a]-p[a]>u[b]-p[b])
    {
        return 0;
    }
    if(u[a]-p[a]<u[b]-p[b])
    {
        return 1;
    }
    for(int i=0; i<=u[a]-p[a]; i++)
    {
        if(m[a][p[a]+i]>m[b][p[b]+i])
        {
            return 0;
        }
        if(m[a][p[a]+i]<m[b][p[b]+i])
        {
            return 1;
        }
    }
    return 1;
}
void Scadere()
{
    while(p[0]<=u[0] && m[0][p[0]]==0)
    {
        p[0]++;
    }
    while(p[3]<=u[3] && m[3][p[3]]==0)
    {
        p[3]++;
    }
    int t=0,c;
    for(int i=0; i<=u[3]-p[3]; i++)
    {
        c=t+m[0][u[0]-i]-m[3][u[3]-i];
        t=0;
        if(c<0)
        {
            c+=10;
            t=-1;
        }
        m[0][u[0]-i]=c;
    }
    for(int i=u[3]-p[3]+1; i<=u[0]-p[0]; i++)
    {
        c=t+m[0][u[0]-i];
        t=0;
        if(c<0)
        {
            c+=10;
            t=-1;
        }
        m[0][u[0]-i]=c;
    }
    while(p[0]<=u[0] && m[0][p[0]]==0)
    {
        p[0]++;
    }
}
void Inmultire (int k, int a, int b)
{
    int t=0,c;
    p[b]=N+1;
    u[b]=N;
    if(u[a]<p[a] || k==0)
    {
        return;
    }
    while(p[a]<=u[a] && m[a][p[a]]==0)
    {
        p[a]++;
    }
    while(p[b]<=u[b] && m[b][p[b]]==0)
    {
        p[b]++;
    }
    for(int i=0; i<=u[a]-p[a]; i++)
    {
        c=t+m[a][u[a]-i]*k;
        t=c/10;
        c=c-t*10;
        p[b]--;
        m[b][p[b]]=c;
    }
    while(t>0)
    {
        c=t;
        t=c/10;
        c=c-t*10;
        p[b]--;
        m[b][p[b]]=c;
    }
    while(m[b][p[b]]==0)
    {
        p[b]++;
    }
}
void Radical ()
{
    int i,c;
    p[0]=p[1]=p[2]=p[3]=N+1;
    u[0]=u[1]=u[2]=u[3]=N;
    i=0;
    if(nv%2==0)
    {
        i=1;
    }
    for(; i<nv; i+=2)
    {
        m[0][u[0]+1]=v[i]-'0';
        m[0][u[0]+2]=v[i+1]-'0';
        u[0]+=2;
        Inmultire(2,1,2);
        u[2]++;
        c=-1;
        do
        {
            c++;
            m[2][u[2]]=c;
            Inmultire(c,2,3);
        }
        while(c<10 && Maimic(3,0));
        c--;
        m[2][u[2]]=c;
        Inmultire(c,2,3);
        Scadere();
        u[1]++;
        m[1][u[1]]=c;
    }
}
int main()
{
    int i;
    v[0]='0';
    f.getline(v+1,N);
    nv=0;
    while(v[nv])
    {
        nv++;
    }
    nv--;
    Radical();
    for(i=p[1]; i<=u[1]; i++)
    {
        g<<m[1][i];
    }
    return 0;
}