summaryrefslogtreecommitdiff
path: root/nonrecurfact.c
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2020-02-22 09:56:09 +0000
committerrodri <rgl@antares-labs.eu>2020-02-22 09:56:09 +0000
commita39951d8f69209cfea2b7051832b851914e662ef (patch)
treee4cd1c32e5d6f531b523f6fda558cc3a5f603547 /nonrecurfact.c
downloadbrokentoys-a39951d8f69209cfea2b7051832b851914e662ef.tar.gz
brokentoys-a39951d8f69209cfea2b7051832b851914e662ef.tar.bz2
brokentoys-a39951d8f69209cfea2b7051832b851914e662ef.zip
now version controlled.
Diffstat (limited to 'nonrecurfact.c')
-rw-r--r--nonrecurfact.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/nonrecurfact.c b/nonrecurfact.c
new file mode 100644
index 0000000..3fdbf78
--- /dev/null
+++ b/nonrecurfact.c
@@ -0,0 +1,58 @@
+/* non-recursive factorial */
+#include <u.h>
+#include <libc.h>
+
+void
+printdec(int n)
+{
+ char s[16], *p;
+ int r;
+
+ p = s+16;
+ *--p = '\n';
+ for(;;){
+ r = n%10;
+ *--p = '0'+r;
+ n /= 10;
+ if(n == 0 || p == s)
+ break;
+ }
+ write(1, p, s+sizeof(s)-p);
+}
+
+int
+fact(int n)
+{
+ int a;
+
+ a = n;
+repeat:
+ if(n <= 0)
+ return 0;
+ else if(n == 1)
+ return a;
+ a *= --n;
+ goto repeat;
+}
+
+void
+usage(void)
+{
+ fprint(2, "usage: %s n\n", argv0);
+ exits("usage");
+}
+
+void
+main(int argc, char *argv[])
+{
+ int n;
+
+ ARGBEGIN{
+ default: usage();
+ }ARGEND;
+ if(argc != 1)
+ usage();
+ n = strtol(argv[0], nil, 0);
+ printdec(fact(n));
+ exits(0);
+}