Cod sursa(job #187630)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 4 mai 2008 21:59:47
Problema Sarpe Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 1010
#define CIF 1000010
int a[CIF],N[MAX],two[CIF],nm1[MAX],nm2[MAX];
void copy(int A[],int b){
     A[0]=1;
     A[1]=b;
}
void sub(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]--);
}
void cp(int A[],int B[],int c){
     int i;
     int AUX[MAX];
     A[0]=B[0];
     for (i=1;i<=A[0];++i)
         A[i]=B[i];
     copy(AUX,c);
     sub(A,AUX);     
}
void mul1(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 mul2(int A[], int B[]){
      int i, j, t, C[MAX];
      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 print(int A[]){
     int i;
     for (i=A[0];i>=1;--i)
         printf("%d",A[i]);
}
void add(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;
}
int main(){
    char s[MAX];
    int i,x;
    freopen("sarpe.in","r",stdin);
    freopen("sarpe.out","w",stdout);
    gets(s);
    x=strlen(s);
    for (i=x-1;i>=0;--i)
        N[++N[0]]=s[i]-'0';
    copy(a,4);
    mul2(a,N);
    copy(two,2);
    cp(nm1,N,1);
    cp(nm2,N,2);
    mul2(two,nm1);
    mul2(two,nm2);
    add(a,two);
    print(a);
    exit(0);
}