Cod sursa(job #2106145)

Utilizator stefantagaTaga Stefan stefantaga Data 15 ianuarie 2018 09:24:51
Problema Next Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.64 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("next.in");
ofstream g("next.out");
int comparare(int a[1000001],int b[1000001])
{
    int i;
    if (a[0]<b[0])
    {
        return 2;
    }
    else
    if (a[0]>b[0])
    {
        return 1;
    }
    else
    {
        for (i=1;i<=a[0];i++)
        {
            if (a[i]>b[i])
            {
                return 1;
            }
            else
            if (a[i]<b[i])
            {
                return 2;
            }
        }
    }
    return 0;
}
void scadere (int a[1000001],int b[1000001])
{
    int t=0,i;
    for (i=1;i<=a[0];i++)
    {
        a[i]=(a[i]-b[i]-t);
        if (a[i]<0)
        {
            t=1;
        }
        else
        {
            t=0;
        }
        if (t==1)
        {
            a[i]+=10;
        }
    }
    if (t==1)
    {
        a[a[0]]-=t;
        if (a[a[0]]==0)
        {
            a[0]--;
        }
    }
    else
    if (a[a[0]]==0)
    {
        a[0]--;
    }
}
void shl (int a[1000001],int nrp)
{int i;
    for (i=nrp+1;i<=a[0]+nrp;i++)
    {
        a[i]=a[i-nrp];
    }
    a[0]=a[0]+nrp;
}
void impartire(int a[1000001],int b[1000001],int c[1000001],int r[1000001])
{
    int i;
    c[0]=a[0];
    for (i=a[0];i>=1;i--)
    {
        shl(r,1);
        r[1]=a[i];
        while (comparare(b,r)!=1)
        {
            c[i]++;
            scadere(r,b);
        }
    }
    while (!c[c[0]]&&c[0]>1)
    {
        c[0]--;
    }
}
void inmultire(int a[1000001],int b[1000001],int c[1000001])
{
    int i,j,T=0;

  c[0]=a[0]+b[0]-1;
  for (i=1;i<=a[0];i++)
    for (j=1;j<=b[0];j++)
      c[i+j-1]+=a[i]*b[j];
  for (i=1;i<=c[0];i++)
    { T=(c[i]+=T)/10;
      c[i]%=10;
    }
  if (T) c[++c[0]]=T;
}
int a[1000001],b[1000001],c[1000001],r[1000001],d[1000001],ccc;
int i,n,m;
char cc,s[1000001];
int main()
{
    f.getline (s,1000001);
    a[0]=strlen(s);
    for (i=0;i<strlen(s);i++)
    {
        a[a[0]-i]=s[i]-'0';
    }
    f.getline (s,1000001);
    b[0]=strlen(s);
    for (i=0;i<strlen(s);i++)
    {
        b[b[0]-i]=s[i]-'0';
    }
    impartire (a,b,c,r);
    int t=0;
    if (r[1]!=0)
    {
        for (i=1;i<=c[0];i++)
    {
        if (i==1)
        {
            ccc=c[i];
            c[i]=(c[i]+1+t)%10;
            t=(ccc+1+t)/10;
        }
        else
        {
            ccc=c[i];
            c[i]=(c[i]+t)%10;
            t=(ccc+t)/10;
        }
    }
    c[0]+=t;
    c[c[0]]+=t;
    }

    inmultire (b,c,d);
    for (i=d[0];i>=1;i--)
    {
        g<<d[i];
    }
    return 0;
}