Cod sursa(job #993887)

Utilizator andreiblaj17Andrei Blaj andreiblaj17 Data 4 septembrie 2013 17:04:25
Problema Next Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#define vecin vector <int>

using namespace std;

vecin n,d,vprim;

vecin add(vecin a, vecin b){
    int t=0;

    for (int i=b[0]+1; i<=a[0]; i++) b.push_back(0);
    for (int i=1; i<=a[0]; i++){
        a[i]+=b[i]+t;
        t=a[i]/10;
        a[i]%=10;
    }
    if (t>0) a[0]++, a.push_back(0), a[a[0]]=t;

    return a;
}

unsigned long long divide(vecin a, unsigned long long x){
    int t=0;
    unsigned long long r=0;

    for (int i=a[0]; i>=1; i--)
        r=(10*r+a[i])%x;

    return r;
}

int count_d(unsigned long long x){
    unsigned long long k=0,j=x;

    while (j) {
        j=int(j/10);
        k++;
    }

    return k;
}

int main()
{
    string s;
    int ls,ld,l,k=0,c=1,f=10;
    unsigned long long dprim,rest,si=0;

    ifstream in("next.in");
    ofstream out("next.out");

    in >> s;

        l=int(s.size());
        for (int i=1; i<=l; i++)
            swap(s[i], s[0]);
        n.push_back(l);
        for (int i=l; i>=1; i--)
            n.push_back(int(s[i])-48);

    in >> dprim;

        rest=divide(n, dprim);
        dprim=dprim-rest;
        k=count_d(dprim);
        d.push_back(k);

        while (dprim>0){
            si=si*10+dprim%10;
            dprim=int(dprim/10);
        }

        for (int i=2; i<=k; i++) c*=10;

        for (int i=1; i<=k; i++)
            d.push_back(int(si/c)%f), c/=10;

        n=add(n, d);

    for (int i=n[0]; i>=1; i--)
        cout << n[i];

    return 0;
}