Cod sursa(job #2673162)

Utilizator NeacsuMihaiNeacsu Mihai NeacsuMihai Data 16 noiembrie 2020 02:39:05
Problema Next Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.04 kb
#include <iostream>
#include <fstream>
#include <cstring>

using namespace std;

ifstream fin ("next.in");
ofstream fout ("next.out");
char s[1000001];
int n[1000001], d[20], r[20];
void adunare(int a[], int b[])
{
    //a<- a+b
    int i, r=0;
    for(i=a[0]+1; i<=b[0]; i++) a[i]=0;
    for(i=b[0]+1; i<=a[0]; i++) b[i]=0;
    a[0]=max(a[0], b[0]);
    for(i=1; i<=a[0]; i++)
    {
        a[i]=a[i]+b[i]+r;
        r=a[i]/10;
        a[i]%=10;
    }
    if(r)
    {
        a[++a[0]]=r;
    }
}
void scadere(int a[], int b[])
{
    //a=a-b, se garanteaza a>=b
    int i, r=0;
    for(i=b[0]+1; i<=a[0]; i++) b[i]=0;
    for(i=1; i<=a[0]; i++)
    {
        a[i]=a[i]-r-b[i];
        r=0;
        if(a[i]<0)
        {
            r=1;
            a[i]+=10;
        }
    }
    while(a[0]>1 && a[a[0]]==0) a[0]--;
}
int comparare(int a[], int b[])
{
    if(a[0]<b[0]) return -1;
    if(a[0]>b[0]) return 1;
    for(int i=a[0]; i>0; i--)
    {
        if(a[i]>b[i]) return 1;
        else if(b[i]>a[i]) return -1;
    }
    return 0;
}
void inmultire10(int a[])
{
    for(int i=a[0]+1; i>=2; i--)
    {
        a[i]=a[i-1];
    }
    a[0]++;
}
void impartire(int a[], int b[])
{
    //c=a/b;
    int i; r[0]=1; r[1]=0;
    for(i=a[0]; i>0; i--)
    {
        inmultire10(r);
        r[1]=a[i];
        while( comparare(b, r)!=1 )
        {
            scadere(r, b);
        }

        /*a[i]=r*10+a[i];
        r=a[i]%x;
        a[i]/=x;*/
    }
}
void afisare(int a[])
{
    for(int i=a[0]; i>0; i--) fout<<a[i];
    fout<<"\n";
}
void citire()
{
    int i, str;
    fin.getline(s, 1000001);
    str=strlen(s);
    n[0]=str;
    for(i=str-1; i>=0; i--)
    {
        n[str-i]=s[i]-'0';
    }
    fin.getline(s, 1000001);
    str=strlen(s);
    d[0]=str;
    for(i=str-1; i>=0; i--)
    {
        d[str-i]=s[i]-'0';
    }
}
int main()
{
    citire();

    impartire(n, d);
    if(r[0]!=1 || r[1]!=0)
    {
        scadere(d, r);
        adunare(n, d);
    }
    afisare(n);
}