diff options
| author | Tyge Løvset <[email protected]> | 2023-03-13 12:40:07 +0100 |
|---|---|---|
| committer | Tyge Løvset <[email protected]> | 2023-03-13 12:40:07 +0100 |
| commit | 5ef0986e98ef021e5ce2f46cdaba244c2c51bc4c (patch) | |
| tree | 1ea17905ceeafe0e4fd4c748d3fb11dbc0a72191 /misc/examples/triples.c | |
| parent | fddae5ef07fc0e9a018e56a9843e059a737e4db7 (diff) | |
| download | STC-modified-5ef0986e98ef021e5ce2f46cdaba244c2c51bc4c.tar.gz STC-modified-5ef0986e98ef021e5ce2f46cdaba244c2c51bc4c.zip | |
Fixed bug and improved generic c_eraseremove_if().
Diffstat (limited to 'misc/examples/triples.c')
| -rw-r--r-- | misc/examples/triples.c | 35 |
1 files changed, 25 insertions, 10 deletions
diff --git a/misc/examples/triples.c b/misc/examples/triples.c index 4783d603..aac7967a 100644 --- a/misc/examples/triples.c +++ b/misc/examples/triples.c @@ -4,12 +4,12 @@ #include <stdio.h> void triples_vanilla(int n) { - for (int i = 1, c = 1;; ++c) { + for (int i = 5, c = 1;; ++c) { for (int a = 1; a < c; ++a) { - for (int b = a; b < c; ++b) { - if (a*a + b*b == c*c) { - printf("{%d, %d, %d},\n", a, b, c); - if (++i > n) goto done; + for (int b = a + 1; b < c; ++b) { + if ((int64_t)a*a + (int64_t)b*b == (int64_t)c*c) { + if (i++ == n) goto done; + printf("{%d, %d, %d}\n", a, b, c); } } } @@ -25,10 +25,10 @@ struct triples { bool triples_next(struct triples* I) { cco_begin(I); - for (I->c = 1;; ++I->c) { + for (I->c = 5;; ++I->c) { for (I->a = 1; I->a < I->c; ++I->a) { - for (I->b = I->a; I->b < I->c; ++I->b) { - if (I->a*I->a + I->b*I->b == I->c*I->c) { + for (I->b = I->a + 1; I->b < I->c; ++I->b) { + if ((int64_t)I->a*I->a + (int64_t)I->b*I->b == (int64_t)I->c*I->c) { if (I->n-- == 0) cco_return; cco_yield(true); } @@ -36,9 +36,18 @@ bool triples_next(struct triples* I) { } } cco_final: + puts("done"); cco_end(false); } +int gcd(int a, int b) { + while (b) { + int t = a % b; + a = b; + b = t; + } + return a; +} int main() { @@ -47,8 +56,14 @@ int main() puts("\nCoroutine triples:"); struct triples t = {INT32_MAX}; + int n = 0; + while (triples_next(&t)) { - if (t.c < 100) printf("{%d, %d, %d},\n", t.a, t.b, t.c); - else cco_stop(&t); + if (gcd(t.a, t.b) > 1) + continue; + if (t.c < 1000) + printf("%d: {%d, %d, %d}\n", ++n, t.a, t.b, t.c); + else + cco_stop(&t); } } |
