Cod sursa(job #1408668)

Utilizator raduzxstefanescu radu raduzx Data 30 martie 2015 10:25:25
Problema Sarpe Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <fstream>
#include <cmath>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
char n[10003];
void Mult(short H[], unsigned long X)
{ int i;
  unsigned long T=0;

  for (i=1;i<=H[0];i++)
    { H[i]=H[i]*X+T;
      T=H[i]/10;
      H[i]=H[i]%10;
    }
  while (T)
    { H[++H[0]]=T%10;
      T/=10;
    }
}
void MultHuge(short A[],short B[],short C[])
{ int i,j,T=0;

  C[0]=A[0]+B[0]-1;
  for (i=1;i<=A[0]+B[0];) C[i++]=0;
  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;
}

void Add(short A[], short B[])
{ int i,T=0;

  if (B[0]>A[0])
    { for (i=A[0]+1;i<=B[0];) A[i++]=0;
      A[0]=B[0];
    }
    else for (i=B[0]+1;i<=A[0];) B[i++]=0;
  for (i=1;i<=A[0];i++)
    { A[i]+=B[i]+T;
      T=A[i]/10;
      A[i]%=10;
    }
  if (T) A[++A[0]]=T;
}
int main()
{
    ifstream f("sarpe.in");
    ofstream g("sarpe.out");
    short a,b[10003],i,c[10003],d[10003],e[100003];
    i=0;
    while(f>>n[i])
        i++;
    a=i;
    b[0]=a;
    for(i=a;i>=1;i--)
    {

        b[a-i+1]=int(n[i-1]-'0');
        c[a-i+1]=b[a-i+1];
        d[a-i+1]=b[a-i+1];
    }
    c[0]=a;
    d[0]=a;
    Mult(b,4);
    i=1;
    while(c[i]==0)
    {
        c[i]=9;
        i+=1;
    }
    c[i]-=1;
    if(c[a]==0)
        c[0]-=1;
    i=1;
    int
    o=2;
    while(o>0)
    {
        if(d[i]>0)
        {
            if(d[i]>=o)
            {
                d[i]-=o;
                o=0;
            }
            else
            {
                d[i]=9;
                o=1;
            }
        }
        else
            d[i]=10-o;
        i++;
    }
    int t=0;
    for(i=1;i<=d[0];i++)
    {

        d[i]=(d[i]*2+t);
        t=d[i]/10;
        d[i]%=10;
    }
    if(t!=0)
    {
        d[0]+=1;
        d[0]=t;
    }
    MultHuge(c,d,e);
    Add(e,b);
    for(i=1;i<=e[0];i++)
        g<<e[e[0]-i+1];
    f.close();
    g.close();
    return 0;
}