diff options
author | rodri <rgl@antares-labs.eu> | 2020-02-22 09:56:09 +0000 |
---|---|---|
committer | rodri <rgl@antares-labs.eu> | 2020-02-22 09:56:09 +0000 |
commit | a39951d8f69209cfea2b7051832b851914e662ef (patch) | |
tree | e4cd1c32e5d6f531b523f6fda558cc3a5f603547 /gcd.c | |
download | brokentoys-a39951d8f69209cfea2b7051832b851914e662ef.tar.gz brokentoys-a39951d8f69209cfea2b7051832b851914e662ef.tar.bz2 brokentoys-a39951d8f69209cfea2b7051832b851914e662ef.zip |
now version controlled.
Diffstat (limited to 'gcd.c')
-rw-r--r-- | gcd.c | 68 |
1 files changed, 68 insertions, 0 deletions
@@ -0,0 +1,68 @@ +#include <u.h> +#include <libc.h> + +enum { + Tgcd, + Tmod, + Te +}; +vlong t[Te]; +vlong t0; + +void +swap(int *a, int *b) +{ + int tmp; + + tmp = *a; + *a = *b; + *b = tmp; +} + +int +gcd(int u, int v) +{ + while(u > 0){ + if(u < v) + swap(&u, &v); + u = u-v; + } + return v; +} + +int +modgcd(int u, int v) +{ + while(u > 0){ + if(u < v) + swap(&u, &v); + u = u % v; + } + return v; +} + +void +usage(void) +{ + fprint(2, "usage: gcd num den\n"); + exits("usage"); +} + +void +main(int argc, char *argv[]) +{ + int n, m; + + if(argc != 3) + sysfatal("not enough arguments"); + n = strtol(argv[1], nil, 0); + m = strtol(argv[2], nil, 0); + t0 = nsec(); + print("GCD %d %d = %d\n", n, m, gcd(n, m)); + t[Tgcd] = nsec()-t0; + t0 = nsec(); + print("MODGCD %d %d = %d\n", n, m, modgcd(n, m)); + t[Tmod] = nsec()-t0; + print("\tgcd: %lld | mod: %lld\n", t[Tgcd], t[Tmod]); + exits(nil); +} |