Cod sursa(job #2395016)

Utilizator cyg_dragos10Ivan Dragos cyg_dragos10 Data 2 aprilie 2019 09:52:22
Problema Next Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 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[])
{
   // memset(c,0,sizeof(c));
    int i,tr,aux;
   
    tr = 0;
    for(i = 1;i <= a[0];i++)
    {
        aux = a[i] + b[i] + tr;
        a[i] = aux % 10;
        tr = aux / 10;
    }
    if(tr)
        a[++a[0]] = tr;
}

int main()
{
    freopen("next.in","r",stdin);
    freopen("next.out","w",stdout);
    char ch;
    int a[NMAX],i,b[25];
    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);
        for(i = a[0];i >= 1;i--)
            printf("%d",a[i]);
    }
    else
    for(i = a[0];i >= 1;i--)
        printf("%d",a[i]);
    return 0;
}