Cod sursa(job #2189324)

Utilizator CristeaCristianCristea Cristian CristeaCristian Data 27 martie 2018 23:43:11
Problema Next Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.97 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int NMAX=1000000;
int v[NMAX+5],c[NMAX+5],a[NMAX+5],b[NMAX+5];
long long d;
void hn_adun(int a[],int b[], int c[NMAX+5])
{
    int i,tr,aux;
    memset(c,0,sizeof(c));
    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]]=1;
}
void hn_constr(int n,int x[NMAX+5])
{
    memset(x,0,sizeof(x));
    do
    {
        x[++x[0]]=n%10;
        n=n/10;
    }
    while(n);
}
void print(int x[])
{
    int i;
    for(i=x[0]; i>=1; i--)
        printf("%d",x[i]);
}
void hn_prod(int a[],int b[],int c[2*NMAX+5])
{
    int i,j,tr,aux;
    memset(c,0,sizeof(c));
    c[0]=a[0]+b[0]-1;
    for(i=1; i<=a[0]; i++)
        for(j=1; j<=b[0]; j++)
            c[i+j-1]+=a[i]*b[j];
    tr=0;
    for(i=1; i<=c[0]; i++)
    {
        aux=c[i]+tr;
        c[i]=aux%10;
        tr=aux/10;
    }
    while(tr)
    {
        c[++c[0]]=tr%10;
        tr/=10;
    }
}
void hn_divide(int a[], long long k,int c[NMAX+5 ])
{
    int i;
    long long r;
    memset(c,0,sizeof(c));
    r=0;
    for(i=a[0]; i>=1; i--)
    {
        r=r*10+a[i];
        c[++c[0]]=r%k;
        r/=k;
    }
    int st=1,dr=c[0],aux;
    while(st<=dr)
    {
        aux=c[st];
        c[st]=c[dr];
        c[dr]=aux;
        st++;
        dr--;
    }
    while(c[c[0]]==0 && c[0]>1)
        c[0]--;
}
long long hn_divide_rest(int a[], long long k)
{
    long long r;
    int i;
    r=0;
    for(i=a[0]; i>=1; --i)
    {
        r=r*10+a[i];
        r=r%k;
    }
    return r;
}

int main()
{
    freopen("next.in","r",stdin);
    freopen("next.out","w",stdout);
    char ch;
    long long i=1;
    long long d;
    v[0]=0;
    while(scanf("%c",&ch)&&ch!='\n')
        v[++v[0]]=ch-48;
    scanf("%lld",&d);
    reverse(v+1,v+v[0]+1);
    long long r=hn_divide_rest(v,d);
    if(r==0)
       print(v);
  else
    {
        long long ans=d-r;
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        hn_constr(ans,a);
        hn_adun(v,a,b);
        print(b);

    }
    return 0;
}
/*
#include <cstdio>
#include <algorithm>
#include <cstring>

using namespace std;
const int NMAX=1000;
int a[NMAX+5],b[NMAX+5],c[NMAX+5];
void hn_constr(int n,int x[NMAX+5]) {
    memset(x,0,sizeof(x));
    do {
        x[++x[0]]=n%10;
        n=n/10;
    } while(n);
}
void print(int x[]) {
    int i;
    for(i=x[0]; i>=1; i--)
        printf("%d",x[i]);
}
void hn_adun(int a[],int b[], int c[NMAX+5]) {
    int i,tr,aux;
    memset(c,0,sizeof(c));
    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]]=1;
}
void hn_scad(int a[],int b[],int c[NMAX+5]) {
    int i,aux,impr;
    impr=0;
    memset(c,0,sizeof(c));
    c[0]=a[0];
    //hn_cmp
    for(i=1; i<=c[0]; i++) {
        aux=a[i]-b[i]-impr;
        if(aux<0) {
            c[i]=aux+10;
            impr=1;
        } else {
            c[i]=aux;
            impr=0;
        }
        while(c[c[0]]==0 &&c[0]>1)
            c[0]--;
    }
}
void hn_prod(int a[],int b[],int c[2*NMAX+5]) {
    int i,j,tr,aux;
    memset(c,0,sizeof(c));
    c[0]=a[0]+b[0]-1;
    for(i=1; i<=a[0]; i++)
        for(j=1; j<=b[0]; j++)
            c[i+j-1]+=a[i]*b[j];
    tr=0;
    for(i=1; i<=c[0]; i++) {
        aux=c[i]+tr;
        c[i]=aux%10;
        tr=aux/10;
    }
    while(tr) {
        c[++c[0]]=tr%10;
        tr/=10;
    }
}
int main() {
    int n,m,cer;
    scanf("%d%d%d",&cer,&n,&m);
    hn_constr(n,a);
    hn_constr(m,b);
    if(cer==1) {
        hn_adun(a,b,c);
        print(c);
    }
    if(cer==2) {
        hn_scad(a,b,c);
        print(c);
    }
    if(cer==3) {
        hn_prod(a,b,c);
        print(c);
    }
    return 0;
}

*/