home *** CD-ROM | disk | FTP | other *** search
- /* gcd - greatest common divisor of two integers */
- /* 1982/10/17 12:11
- submitted by William G. Hutchison, Jr.
- P.O. Box 278
- Exton, PA 19341-0278
- U.S.A.
-
- CompuServe 70665,1307
-
- */
-
- #ifdef UNIX
- unsigned
- #endif
- gcd(x,y)int x,y;
- {
- return(gcdu(abs(x),abs(y)));
- } /* end gcd */
-
- #ifdef UNIX
- unsigned
- #endif
- gcdu(u, v)unsigned u, v;
- {
- register unsigned k, x, y;
- x= u, y= v;
- if(x==0||y==0)return(1);
- for(k= 0; (((x|y) & 1) == 0); k++) {
- x>>=1;
- y>>=1;
- }
- /* gcdu(u, v) = (2^k) * gcdu(x,y) */
- do{ /* odd(x) | odd(y) */
-
- while((x&1) == 0) x>>=1;
- while((y&1) == 0) y>>=1;
- /* odd(x) & odd(y) */
- if (x > y) x-= y;
- else y-= x;
- } while (x>0 && y>0);
- return((x==0? y:x) << k);
- } /* end gcdu */
-
- /* Alagic, Suad & Arbib, Michael A. "The Design of Well Structured
- and Correct Programs" Springer-Verlag, New York 1978, p. 225. */
-
- #ifdef MAINLY
- #else
- #include "c80def.h"
- #include "printf.c"
-
- main() {
- int p, q;
- p= 2*3*5*7*17;
- q= 11*13*17;
- printf("gcd(%d,%d)=%d\n", p, q, gcd(p, q));
- for(p= 0; p < 21; p++) for(q=0; q < 21; q++)
- printf("gcd(%3d,%3d)=%d\n", p, q, gcd(p, q));
- } /* end main */
-
- abs(x)int x;
- {
- return(x>=0? x:-x);
- } /* end abs */
- #endif