Cod sursa(job #1620863)

Utilizator felixiPuscasu Felix felixi Data 29 februarie 2016 13:32:51
Problema Sarpe Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <fstream>
#include <string.h>

using namespace std;

ofstream fout("sarpe.out");

int a[2];
int n[2005];
int n1[2005];
int n2[2005];
int r[2005];
int r1[2005];
int r2[2005];
int r3[2005];


void citire(){
    ifstream fin("sarpe.in");
    n[0] = 0;
    //char x;
    //fin.get(x);
    //while (!fin.eof()){
    //  n[++n[0]] = x - '0';
    //  fin.get(x);
    //}
    char s[1002];
    fin.getline(s,1001);
    n[0] = (int)strlen(s);
    for (int i = 0; i < n[0]; i++)
        n[i + 1] = s[i] - '0';
    fin.close();
}

void invers(int a[]) {
    for (int i = 1; i <= (a[0] >> 1); i ++) {
        int aux = a[i];
        a[i] = a[a[0] - i + 1];
        a[a[0] - i + 1] = aux;
    }
}

void inmultire(int a[2005], int b[2005], int c[2005]){
    int p = 0;
    int n = a[0];
    for(int i = 1; i<= b[0]; i++) {
        for(int j = 1; j <= a[0]; j++)
            c[j + p] += a[j] * b[i];
        p++;
    }
    n += p - 1;
    for(int j = 1; j <= n; j++){
        c[j + 1] += c[j] / 10;
        c[j] %= 10;
    }
    if(c[n + 1] > 0)
        n++;
    c[0] = n;
}


void adun(int a[], int b[], int c[]) {
    int t =0;
    int n = (a[0] > b[0]) ? a[0] : b[0];
    for (int i = 1; i <= n; i ++) {
        int cif = a[i] + b[i] + t;
        c[i] = cif % 10;
        t  = cif / 10;
    }
    if (t > 0)
        c[n ++] = t;
    c[0] = n;
}

void scad_1(int a[]){
    a[1] --;
    int i = 1;
    while (i <= a[0] && a[i] < 0) {
        a[i + 1]--;
        a[i++] += 10;
    };
    i = a[0];
    while (i > 1 && !a[i] )i--;
    a[0]= i;

}

void afisare(int a[]){

    for(int i = a[0] ; i > 0 ; i--)
        fout << a[i];
    fout << endl;

}


int main() {
    citire();
    if (n[0] == 1 && n[1] == 1) {
        fout << 2;
        return 0;
    }
    invers(n);
    a[0] = 1;
    a[1] = 4;
    inmultire(a, n, r1);
    //afisare(r1);
    memcpy(n1, n, sizeof(n));
    scad_1(n1);
    //afisare(n1);
    memcpy(n2, n1, sizeof(n1));
    scad_1(n2);
    //afisare(n2);
    inmultire(n1, n2, r2);
    //afisare(r2);
    a[0] = 1;
    a[1] = 2;
    inmultire(a,r2, r3);
    //afisare(r3);
    adun(r1, r3, r);
    afisare(r);
    fout.close();
    return 0;
}