Cod sursa(job #2260576)

Utilizator StefantimStefan Timisescu Stefantim Data 15 octombrie 2018 10:26:19
Problema Next Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int a[1000001] , c[1000001] , d[1000005] ;
void citire(int a[])
{
    char ch ;
    while(scanf("%c",&ch))
    {
        if(ch ==' ')
            continue ;
        else
        if(ch=='\n')
        {
            break ;
        }
        else
        {
            a[++a[0]]=ch-48 ;
        }
            
    }
}
void next_perm(int a[] , int c[] , long long b)
{
    long long r = 0 , cop ;
    int i ;
    for(i=1;i<=a[0];i++)
    {
        r = r * 10 + (long long)(a[i]) ;
        if(r>b)
            r = r % b ;
    }
    if(r==0)
        r = b ;
    cop = b - r ;
    do{
        c[0]++;
        c[c[0]]=cop % 10 ;
        cop = cop / 10 ;
    }while(cop>0);
}
void adunare(int x[] , int y[], int d[])
{
    int r = 0 , i,k;
    if(x[0]>y[0])
        d[0]=x[0];
    else
        d[0]=y[0];
    for(i=1;i<=a[0];i++)
    {
        k =x[i]+y[i] + r ;
        d[i] = k % 10 ;
        r = k / 10;
    }
    if(r>0)
    {
        d[d[0]+1]=r;
        d[0]++;
    }
}
 
int main()
{
    freopen("next.in","r",stdin);
    freopen("next.out","w",stdout);
    int i ;
    long long b;
    citire(a);
    scanf("%lld",&b);
    next_perm(a,c,b);
    reverse(a+1,a+a[0]+1);
    adunare(a,c,d);
    for(i=d[0];i>0;i--)
        printf("%d",d[i]);
    return 0;
}