Cod sursa(job #16185)

Utilizator nicolaetitus12Nicolae Titus nicolaetitus12 Data 12 februarie 2007 16:03:54
Problema Fractii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.75 kb
#include <stdlib.h>
#include <math.h>
#include <fstream.h>
#include <stdio.h>
#include <string.h>
typedef struct nod
{unsigned long n;
 nod *urm;
}*PNOD;
PNOD prim=NULL,ultim=NULL;

void invers(char a[],char x[])
{for (int i=0;i<strlen(a);i++)
 {x[strlen(a)-i-1]=a[i];}
 x[strlen(a)]=NULL;
}

void scadere(char a[],char b[],char s[])
{int lb=strlen(b),la=strlen(a);
 int i=0,c=0;
 while(i<lb)
 {s[la-i-1]=a[la-i-1]-b[lb-i-1]-c+48;
  if(s[la-i-1]<48){s[la-i-1]+=10;c=1;}
  else{c=0;}
  i++;
 }
 while(i<la)
 {s[la-i-1]=a[la-i-1]-c;
  i++;
  c=0;
 }
 s[i]='\0';

}

void suma( char a[], char b[], char x[],int off)
{char ia[60],ib[60],s[60];
 invers(a,ia);
 invers(b,ib);
 int la=strlen(a),lb=strlen(b),i=0,c=0;
 while(i<off)
 {s[i]=ia[i];
  i++;
 }
   i=0;
 while(i+off<la&&i<lb)
 {
  s[i+off]=ia[i+off]+ib[i]+c-48;
  if(s[i+off]>57)
  {s[i+off]-=10;c=1;}
  else
  {c=0;}
  i++;
 }

 while(i+off<la)
 {s[i+off]=ia[i+off]+c;
  if(s[i+off]>57){s[i+off]-=10;c=1;}
  else{c=0;}
  i++;
 }
 while(i<lb)
 {s[i+off]=ib[i]+c;
  if(s[i+off]>57){s[i+off]-=10;c=1;}
  else{c=0;}
  i++;
 }


 if(c==1)
 {s[i+off]=49;s[i+1+off]='\0';}
 else{s[i+off]='\0';}
 invers(s,x);

}

void produs (char a[],char b[],char p[])
{char ia[60],ib[60],aux[60]="0",aux2[60];
 int i,j;
 strcpy(p,"0");
 invers(a,ia);
 invers(b,ib);
 int li=strlen(ia),lb=strlen(ib),c=0;
 for (i=0;i<li;i++)
 {c=0;
  for(j=0;j<lb;j++)
  {aux[j]=((ia[i]-48)*(ib[j]-48)+c)%10+48;
   c=((ia[i]-48)*(ib[j]-48)+c)/10;
  }
  if(c!=0)
  {aux[j]=c+48;aux[j+1]='\0';}
  else{aux[j]='\0';}

  invers(aux,aux2);
  suma(p,aux2,aux,i);
  strcpy(p,aux);
//  cout<<aux<<"  "<<aux2<<endl;
 }
}
void adauga(unsigned long n)
{PNOD q=new nod;
 if(!prim)
 {prim=q;}
 else
 {ultim->urm=q;}
 q->urm=NULL;
 q->n=n;
 ultim=q;
}

void calculeazaNumerePrime(long n)
{PNOD p;
 long i;
 int sw;
 adauga(2);
 for (i=3;i<n;i+=2)
 {sw=0;
  for (p=prim->urm;p!=NULL&&sqrt(i)>=p->n;p=p->urm)
  {if(i%p->n==0)
   {sw=1;
    break;
   }
  }
  if(sw==0)
  {adauga(i);}
 }
}

int main ()
{PNOD p,q;
  long n;
 int k;

 ifstream f("prim.in");
 f>>n;
 calculeazaNumerePrime(n/2+1);
 char sir[60]="0",aux[60],aux2[60],aux3[60],fin[60],*final;
 sprintf(aux,"%ld",n);
 produs(aux,aux,fin);

 for(p=prim;p!=NULL;p=p->urm)
 {if(n/p->n>1)
  {sprintf(aux,"%ld",n/p->n);
   //cout <<n/p->n<<" ";
   scadere(aux,"1",aux2);
   produs(aux,aux2,aux3);

   scadere(fin,aux3,aux);
   strcpy(fin,aux);
  }
  else if(n/p->n)
  {scadere(fin,"1",aux);
   strcpy(fin,aux);
  }

 }
 sprintf(aux,"%ld",n-1);
 scadere(fin,aux,aux2);
 strcpy(fin,aux2);

 ofstream fout("prim.out");
 final=fin;
 while(*final=='0'){final++;}
 fout <<final;
 fout.close();
 return 0;
}