Cod sursa(job #1371702)

Utilizator fluture.godlikeGafton Mihnea Alexandru fluture.godlike Data 4 martie 2015 00:04:47
Problema Next Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
#define SIZE 10000023
#define base 10
FILE *fin, *fout;
using namespace std;
int n[SIZE], d[SIZE], tmp[SIZE], tmp2[SIZE], u;
char s[SIZE];
bool f;
bool check(int a[SIZE], int b[SIZE])
{
    if(a[0] < b[0]) return 1;
    if(a[0] > b[0]) return 0;
    for(int i = a[0]; i>=1; i--)
    {
        if(a[i] < b[i]) return 1;
        if(a[i] > b[i]) return 0;
    }
    return 0;
}
void adunare(int a[SIZE], int b[SIZE])
{
    int carry = 0, temp;
    a[0] = max(a[0], b[0]);
    for(int i = 1; i<=a[0]; i++)
    {
        temp = a[i] + b[i] + carry;
        a[i] = temp%base;
        carry = temp/base;
    }
    if(carry)
    {
        a[0]++;
        a[a[0]] = carry;
    }
}
void afisare(int a[SIZE])
{
    for(int i = a[0]; i>=1; i--) printf("%d", a[i]);
    printf("\n");
}
void inmultire(int a[SIZE], int b1)
{
    int carry = 0, temp;
    for(int i = 1; i<= a[0]; i++)
    {
        temp = a[i] * b1 + carry;
        a[i] = temp%base;
        carry = temp/base;
    }
    while(carry)
    {
        a[0]++;
        a[a[0]] = carry%base;
        carry/=base;
    }
}
int main()
{
    fin = freopen("next.in", "r", stdin);
    fout = freopen("next.out", "w", stdout);
    scanf("%s", s);
    n[0] = strlen(s);
    for(int i = 1; i<= n[0]; i++) n[i] = s[n[0]-i] - '0';
    scanf("%s", s);
    d[0] = strlen(s);
    for(int i = 1; i<= d[0]; i++) d[i] = s[d[0]-i] - '0';
    for(; ;)
    {
        //printf("check\n");
        //afisare(tmp);
        //afisare(tmp2);
        //scanf("%d", &u);
        if(check(tmp, n) == 0) break;
        tmp2[0] = tmp[0];
        for(int i = 1; i<= tmp[0]; i++) tmp2[i]= tmp[i];
        if(f == 0)
        {
        	adunare(tmp, d);
        	f = 1;
        	continue;
        }
        inmultire(tmp, 10000);
    }
    for(; ;)
    {
    	//printf("check2\n");
    	//afisare(tmp2);
    	//scanf("%d", &u);
    	if(check(tmp2, n) == 0) break;
    	adunare(tmp2, d);
    }
    afisare(tmp2);
    fclose(fin);
    fclose(fout);
    return 0;
}