Cod sursa(job #1674823)

Utilizator Valentin0709Datcu George Valentin Valentin0709 Data 4 aprilie 2016 21:20:50
Problema Frac Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.48 kb
#include<stdio.h>
#include<string.h>
using namespace std;

FILE*f=fopen("frac.in","r");
FILE*g=fopen("frac.out","w");

int w,nrsum,sn,j,i,aux,dim,dim2,ok,fract[100][100],v2[10],cop[10],cop2[10],s1[10],sum[100][100],x2[20],div[20],n[20],p[20],ct[20],r[20],q[20],x[20];
char c;

void inc(int a[]) {
    int i=1,r;
    a[1]++;
    while(a[i]>9) {
        r=a[i]/10;
        a[i]%=10;
        a[++i]+=r;
    }
    if(i>a[0]) a[0]=i;
}

void dec(int a[]) {
    int i=1;
    a[i]--;
    while(a[i]<0) {
        a[i]=a[i]+10;
        a[i+1]--;
        i++;
    }

}

int compar(int a[], int b[]) {
    int i;
    if(a[0]>b[0]) return 1;
    else if(b[0]>a[0]) return 2;
         else {
            i=a[0];
            while(b[i]==a[i]&&i!=0) i--;
            if(i==0) return 1;
            else if(a[i]>b[i]) return 1;
                 else return 2;
         }
}

void scad(int a[], int b[]) {
    int i;
    for(i=1;i<=a[0];i++) {
        a[i]=a[i]-b[i];
        if(a[i]<0) {a[i]=a[i]+10; a[i+1]--;}
    }
    i=a[0];
    while(a[i]==0&&i>=1) i--;
    a[0]=i;
}

void impartire(int a[], int b[]) {
    int i,j,k;
    memset(ct,0,sizeof(ct));
    memset(r,0,sizeof(r));
    for(i=a[0];i>=1;i--) {
        ct[i]=0;
        for(j=r[0];j>=1;j--) r[j+1]=r[j];
        r[1]=a[i]; r[0]++;

        k=a[0];
        while(r[k]==0) k--;
        r[0]=k;

        while(compar(r,b)==1) {
            scad(r,b);
            ct[i]++;
        }
    }
    i=a[0];
    while(ct[i]==0) i--;
    ct[0]=i;
}

int verif1(int a[]) {
    int i;
    if(a[a[0]]!=1) return 1;
    for(i=1;i<a[0];i++) {
        if(a[i]!=0) return 1;
    }
    return 0;
}

void produs(int a[], int b[]) {
    int i,j,d,r,f;
    d=0; r=0;
    for(i=1;i<=a[0];i++) {
        j=1;
        while(j<=b[0]||r!=0) {
            f=a[i]*b[j]+r;
            q[j+d]=f%10;
            r=f/10;
            j++;
        }
        d++;
    }
    i=j+d;
    while(q[i]==0) i--;
    q[0]=i;
}

void copiere(int a[], int b[]) {
    int i;
    for(i=0;i<=a[0];i++) a[i]=0;
    for(i=0;i<=b[0];i++) a[i]=b[i];
}

void adun(int a[],int b[]) {
    int l,f,r,i;
    if(a[0]>b[0]) l=a[0];
    else l=b[0];
    r=0;
    for(i=1;i<=l||r!=0;i++) {
        f=b[i]+a[i]+r;
        b[i]=f%10;
        r=f/10;
    }
    b[0]=i-1;
}


int main() {

    do {
        fscanf(f,"%c",&c);
        if(c==' ') break;
        n[++dim]=c-'0';
    }while(1);
    n[0]=dim;
    for(i=1;i<=n[0]/2;i++) {
        aux=n[i];
        n[i]=n[n[0]-i+1];
        n[n[0]-i+1]=aux;
    }
    do {
        fscanf(f,"%c",&c);
        if(c=='\n') break;
        p[++dim2]=c-'0';
    }while(1);
    p[0]=dim2;
    for(i=1;i<=p[0]/2;i++) {
        aux=p[i];
        p[i]=p[p[0]-i+1];
        p[p[0]-i+1]=aux;
    }

    dim=0; div[0]=1; div[1]=2; x[0]=1; x[1]=1;

    while(verif1(n)&&div[0]<=6) {
        impartire(n,div);
        ok=0;
        while(r[0]==0) {
            copiere(n,ct);
            impartire(n,div);
            ok=1;
        }
        if(ok==1) {
            produs(div,x);
            copiere(x,q);
            ++dim;
            for(i=0;i<=div[0];i++) fract[dim][i]=div[i];
        }
        inc(div);
    }
    if(verif1(n)==1) {
        produs(div,x);
        copiere(x,q);
        ++dim;
        for(i=0;i<=div[0];i++) fract[dim][i]=div[i];
    }
    produs(x,p);
    copiere(x2,q);
    v2[0]=1; v2[1]=2;

    for(i=1;i<=dim;i++) {
        for(j=0;j<=fract[i][0];j++) cop[j]=fract[i][j];
        memset(q,0,sizeof(q));
        impartire(x,cop);
        produs(ct,v2);
        adun(q,s1);
    }
    nrsum=1; sum[1][0]=1; sum[1][1]=1;
    for(i=1;i<=dim;i++) {
        sn=nrsum;
        for(j=0;j<=fract[i][0];j++) cop[j]=fract[i][j];
        for(w=1;w<=nrsum;w++) {
            memset(q,0,sizeof(q));
            for(j=0;j<=sum[w][0];j++) cop2[j]=sum[w][j];
            produs(cop,cop2);
            sn++;
            for(j=0;j<=q[0];j++) sum[sn][j]=q[j];
        }
        nrsum=sn;
    }
    for(i=1;i<nrsum;i++) {
       for(j=0;j<=sum[i][0];j++) cop2[j]=sum[i][j];
       adun(cop2,x);
    }
    scad(x,s1);
    impartire(x2,x);
    copiere(x2,ct);

    ok=1;
    while(ok==1) {
        ok=0;
        for(i=1;i<=dim;i++) {
            for(j=0;j<=fract[i][0];j++) cop[j]=fract[i][j];
            impartire(x2,cop);
            if(r[0]==0) {ok=1; dec(x2); break;}
        }
    }
    for(i=x2[0];i>=1;i--) fprintf(g,"%d",x2[i]);

    return 0;
}