Cod sursa(job #338409)

Utilizator miculprogramatorA Cosmina - vechi miculprogramator Data 5 august 2009 19:07:00
Problema Next Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <iostream.h>
#include <stdio.h>
#include <fstream.h>
#define LG_MAX 10000000
typedef int BigNumber[LG_MAX];
BigNumber N,M,r;    //M este rezultatul; M=N+( (D-R) %D ) %10
long long D,i,R,p,nr=0,aux;
char s[LG_MAX],temp,sir[LG_MAX];

int mod (BigNumber a, int b)  //functie calculare rest
{
      int i,t=0;
      for (i=a[0];i>0;i--)
              t=(t*10+a[i])%b;
      return t;
}

int suma (BigNumber a, BigNumber b, BigNumber s) //functie adunare nr mari
{
    int i,cifra,t=0,max;
    if (a[0]<b[0]) max=b[0];
       else max=a[0];
    if (a[0]<b[0])
       {
       max=b[0];
       for (i=a[0]+1;i<=b[0];i++)
           a[i]=0;
       }
    else
         {
         max=a[0];
         for (i=b[0]+1;i<=a[0];i++)
             b[i]=0;
         }
    for (i=1;i<=max;i++)
        {
        cifra=a[i]+b[i]+t;
        s[i]=cifra%10;
        t=cifra/10;
        }
    if (t) s[i]=t;
       else i--;
    s[0]=i;
}

int main()
{
    ifstream f("next.in");
    ofstream g("next.out");
    i=0;
    while (!f.eof() )
          {
          f.get(temp);  //citesc din fisier caracter cu caracter
          if ( (temp=='\r') || (temp=='\n') || (!isdigit(temp)) ) break;
          s[i]=temp;
          i++;
          }
    s[i]='\0';  //inchei sirul cu NULL
    f>>D;
    N[0]=strlen(s); //calculez lungimea sirului
    for (i=N[0]-1;i>=0;i--)
        N[N[0]-i]=s[i]-'0';
    for (i=N[0]+1;i<LG_MAX;i++)
        N[i]=0;
    R=mod(N,D);
    p=D-R;
    p=p%D;
    //p=( (D-R) %D) %10
    i=0;
    while (p)
          {
          sir[i]=p%10 + '0';
          p/=10;
          i++;
          }
    r[0]=strlen(sir);
    for (i=r[0]-1;i>=0;i--)
        r[r[0]-i]=sir[i]-'0';
    for (i=r[0]+1;i<LG_MAX;i++)
        r[i]=0;
    suma (N,r,M);
   for (int i=M[0];i>=1;i--)
         g<<M[i];
    return 0;
}