/*CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
C                                                                             C
C  CONTINUED FRACTION EXPANSION OF A REAL NUMBER                              C
C  06/10/07 (DKC)							      C
C                                                                             C
C  This C program approximates given real numbers with rational numbers using C
C  the continued fraction algorithm.					      C
C                                                                             C
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC*/
      #include <stdio.h>
      #include <math.h>
      void main() {
      double X,Y,B,MAX;
      unsigned int I,J;
      unsigned int A[21],H[21],K[21];
//
      printf(" CONTINUED FRACTION EXPANSION OF A REAL NUMBER \n");
      MAX=65536.0;
      MAX=MAX*32768.0-1.0;
//
// REAL NUMBER
//
      X=0.372965733829521;
      printf(" X=%f \n",X);
//
// COMPUTE THE PARTIAL QUOTIENTS
//
      I=1;
      A[1]=(unsigned int)X;
      if((X<0.0)&&(X!=(double)A[1])) A[1]=A[1]-1;
      B=X-(double)A[1];
      if(B<=0.0) goto L300;
      X=1.0/B;
      for (I=2; I<=20; I++) {
	 if(X>MAX) goto L250;
	 A[I]=(unsigned int)X;
	 B=X-(double)A[I];
	 if(B<=0.0) goto L300;
	 X=1.0/B;
	 }
      I=21;
L250: I=I-1;
//
// COMPUTE THE CONVERGENTS
//
L300: J=I;
      H[1]=A[1];
      K[1]=1;
      Y=(double)H[1];
      Y=Y/(double)K[1];
      I=1;
      printf(" I=%d, H[I]=%d, K[I]=%d, Y=%f \n",I,H[I],K[I],Y);
      if(J==1) goto L500;
//
      H[2]=A[2]*H[1]+1;
      K[2]=A[2]*K[1];
      Y=(double)H[2];
      Y=Y/(double)K[2];
      I=2;
      printf(" I=%d, H[I]=%d, K[I]=%d, Y=%f \n",I,H[I],K[I],Y);
      if(J==2) goto L500;
//
      for (I=3; I<=J; I++) {
	 H[I]=A[I]*H[I-1]+H[I-2];
	 K[I]=A[I]*K[I-1]+K[I-2];
	 Y=(double)H[I];
	 Y=Y/(double)K[I];
	 printf(" I=%d, H[I]=%d, K[I]=%d, Y=%f \n",I,H[I],K[I],Y);
	 }
L500: return;
      }