Cod sursa(job #2394984)

Utilizator cyg_dragos10Ivan Dragos cyg_dragos10 Data 2 aprilie 2019 09:41:20
Problema Next Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

const int NMAX = 1000005;

long long rest_impart_huge_int(int a[],long long k)
{
    int i;
    long long r = 0;
    for(i = a[0];i >= 1;i--)
    {
        r = r * 10 + a[i];
        r = r % k;
    }
    return r;
}

void h_adun(int a[],int b[],int c[NMAX])
{
    memset(c,0,sizeof(c));
    int i,tr,aux;
    c[0] = max(a[0] , b[0]);
    tr = 0;
    for(i = 1;i <= c[0];i++)
    {
        aux = a[i] + b[i] + tr;
        c[i] = aux % 10;
        tr = aux / 10;
    }
    if(tr)
        c[++c[0]] = tr;
}

int main()
{
    freopen("next.in","r",stdin);
    freopen("next.out","w",stdout);
    char ch;
    int a[NMAX],i,b[25],c[NMAX];
    long long d,r;
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    while(scanf("%c",&ch) == 1 && ch != '\n')
    {
        if(ch >= '0' && ch <= '9')
            a[++a[0]] = ch - '0';
    }
    reverse(a + 1,a + a[0] + 1);
    scanf("%I64d",&d);
    r = rest_impart_huge_int(a,d);
    if(r)
    {
        r = d - r;
        do
        {
            b[++b[0]] = r % 10;
            r = r / 10;
        }while(r);
        h_adun(a,b,c);
    }
    for(i = c[0];i >= 1;i--)
        printf("%d",c[i]);
    return 0;
}