Cod sursa(job #1429515)

Utilizator alexandra_udristoiuUdristoiu Alexandra Maria alexandra_udristoiu Data 6 mai 2015 16:20:27
Problema Sarpe Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include<fstream>
#include<cstring>
using namespace std;
int n, i;
int sol[5000], v[2000], w[2000], r[2000];
char s[2000];
ifstream fin("sarpe.in");
ofstream fout("sarpe.out");
void copiere(int v[], int w[]){
    for(int i = 0; i <= w[0]; i++){
        v[i] = w[i];
    }
}
void adunare(int v[], int w[]){
   int  m = max(v[0], w[0]);
    v[0] = m;
    int t = 0;
    for(i = 1; i <= m; i++){
        v[i] += w[i] + t;
        t = v[i] / 10;
        v[i] %= 10;
    }
    if(t != 0){
        v[++v[0]] = t;
    }
}
void scadere(int v[], int x){
    if(v[1] >= x){
        v[1] -= x;
    }
    else{
        v[1] = 10 + v[1] - x;
        int i = 2;
        while(v[i] == 0){
            v[i] = 9;
            i++;
        }
        v[i]--;
    }
}
void mult(int v[], int x){
    int i, t = 0;
    for(i = 1; i <= v[0]; i++){
        v[i] = v[i] * x + t;
        t = v[i] / 10;
        v[i] %= 10;
    }
    while(t != 0){
        v[++v[0]] = t % 10;
        t /= 10;
    }
}
void inmultire(){
    int i, j, t, x;
    for(i = 1; i <= v[0]; i++){
        t = 0;
        for(j = 1; j <= w[0]; j++){
            sol[i + j - 1] += v[i] * w[j] + t;
            t = sol[i + j - 1] / 10;
            sol[i + j - 1] %= 10;
        }
        x = i + w[0] - 1;
        while(t != 0){
            x++;
            sol[x] += t;
            t = sol[x] / 10;
            sol[x] %= 10;
        }
        sol[0] = max(sol[0], x);
    }
}
int main(){
    fin>> s + 1;
    n = strlen(s + 1);
    r[0] = n;
    for(i = 1; i <= n; i++){
        r[n - i + 1] = s[i] - '0';
    }
    copiere(v, r);
    copiere(w, r);
    scadere(v, 1);
    scadere(w, 2);
    mult(r, 4);
    inmultire();
    mult(sol, 2);
    adunare(sol, r);
    for(i = sol[0]; i >= 1; i--){
        fout<< sol[i];
    }
    fout<<"\n";
    return 0;
}