Cod sursa(job #70657)

Utilizator GabiAlb Gabriel Gabi Data 6 iulie 2007 17:58:45
Problema Sarpe Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include <fstream>
#include <string>
using namespace std;

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

void Inmultire(int A[], int B[])
{    
     int i, j, t, C[100001];  
     
     memset(C, 0, sizeof(C));  
     for (i = 1; i <= A[0]; i++)  
     {   
         for (t=0, j=1; j <= B[0] || t; j++, t/=10) 
             C[i+j-1]=(t+=C[i+j-1]+A[i]*B[j])%10;
         if (i + j - 2 > C[0]) C[0] = i + j - 2;
     }  
     
     memcpy(A, C, sizeof(C));
}

void Adunare(int A[], int B[])
{    
     int i, 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;
}

void Scadere(int A[], int B[])
{    
     int i, t = 0;     
     
     for (i = 1; i <= A[0]; i++)
         A[i] += (t = (A[i] -= B[i] + t) < 0) * 10;  
     for (; A[0] > 1 && !A[A[0]]; A[0]--);
}

int main()
{
    ifstream fin("sarpe.in");
    ofstream fout("sarpe.out");
    
    string s;
    int nr[100001], nr2[100001], nr3[100001], n;
    int a[2], b[2];
    
    getline(fin, s);
    
    n = s.length();
    
    for (int i = 0; i < n; i++)
        nr[n-i] = s[i] - '0';
        
    nr[0] = n;
    a[0] = 1;
    a[1] = 1;
    b[0] = 1;
    b[1] = 2;
    
    memcpy(nr2, nr, sizeof(nr));
    memcpy(nr3, nr, sizeof(nr));
    
    Inmultire_mic(nr, 4);
    Scadere(nr2, a);
    Scadere(nr3, b);
    Inmultire(nr2, nr3);
    Inmultire_mic(nr2, 2);
    Adunare(nr, nr2);
    
    for (int i = nr[0]; i >= 1; i--)
        fout << nr[i];
        
    fout << "\n";
        
    fin.close();
    fout.close();
    
    return 0;
}