Cod sursa(job #1354076)

Utilizator ignadariusIgna Darius ignadarius Data 21 februarie 2015 17:04:34
Problema Next Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#define BASE 10

using namespace std;
ifstream f("next.in");
ofstream g("next.out");
typedef int Huge[10000000];
Huge P,B;

string s;

unsigned long long d;


long long Divide(Huge A, long long X)
/* A <- A/X si intoarce A%X */
{ int i;
  unsigned long R=0;

  for (i=A[0];i;i--)
    { A[i]=(R=10*R+A[i])/X;
      R%=X;
    }
  while (!A[A[0]] && A[0]>1) A[0]--;
  return R;
}

  void Mult(Huge H, long long X)
/* H <- H*X */
{ int i;
  long 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) /* Cat timp exista transport */
    { H[++H[0]]=T%10;
      T/=10;
    }
}
void Add(Huge A, Huge B)
/* A <- A+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;
}
void AtribValue(Huge H, long long X) {
  H[0] = 0;
  while (X) {
      ++H[0];
      H[H[0]] = X % BASE;
      X /= BASE;
  }
}
void afis(Huge A)
{
    for(int i=1; i<=A[0]; i++)
    g<<A[A[0]-i+1];
}

int main()
{
    f>>s;
    f>>d;
    for(int i=0; i<s.size(); i++)
        P[s.size()-i]=s[i]-'0';
    P[0]=s.size();
    AtribValue(B,1);
    if(Divide(P,d)==0)
    {
        Mult(P,d);
    afis(P);
    }else
    {Add(P,B);
    Mult(P,d);
    afis(P);
    }
}