Cod sursa(job #1728334)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 12 iulie 2016 18:56:29
Problema Next Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include <fstream>
#include <vector>
#include <string>

std::ifstream input_file ( "next.in"  );
std::ofstream output_file( "next.out" );

void mul( std::vector <int> &A, long long B ) {
    int i; long long t = 0;

    for( i = 1; i <= A[0] || t; i ++, t /= 10 )
        A[i] = (t += A[i] * B) % 10;
    A[0] = i - 1;

    return;
}

void add( std::vector <int> &A, std::vector <int> &B ) {
    int i; long long t = 0;

    for( i = 1; i <= A[0] || i <= B[0] || t; i ++, t /= 10 )
        A[i] = ( t += A[i] + B[i] ) % 10;
    A[0] = i - 1;

    return;
}

void div( std::vector <int> &A, long long B ) {
    int i; long long t = 0;

    for( i = A[0]; i > 0; i --, t %= B )
        A[i] = ( t = t * 10 + A[i] ) / B;

    while( A[0] > 1 && !A[ A[0] ] )
        A[0] --;

    return;
}

long long mod( std::vector <int> &A, long long B ) {
    int i; long long t = 0;

    for( i = A[0]; i > 0; i -- )
        t = ( t * 10 + A[i] ) % B;

    return t;
}

void SolveTestCase( void ) {
    int N; long long D, E;

    std::string MyString; input_file >> MyString >> D;
    std::vector <int> A( MyString.length() + 30 ), B( MyString.length() + 30 );

    for( int i = 0; i < MyString.length(); i ++ )
        A[ MyString.length() - i ] = MyString[i] - '0';
    A[0] = MyString.length();

    E = D;
    while( E != 0 ) {
        B[ ++B[0] ] = E % 10;
        E /= 10;
    }

    if( mod( A, D ) == 0 )
        output_file << MyString;
    else {
        div( A, D );
        mul( A, D );
        add( A, B );

        for( int i = A[0]; i >= 1; i -- )
            output_file << A[i];
    }

    return;
}

int main( int argc, const char *argv[] ) {
    int T = 1;

    for( int i = 0; i < T; i ++ )
        SolveTestCase();

    return 0;
}