Fix bugs in printing numbers
diff --git a/src/bc/num.c b/src/bc/num.c
index e5a0dde..734eca1 100644
--- a/src/bc/num.c
+++ b/src/bc/num.c
@@ -1252,21 +1252,32 @@
 static BcStatus bc_num_printDigits(unsigned long num, size_t width, bool radix,
                                    size_t *nchars, FILE *f)
 {
-  if (*nchars + width + 1 >= BC_NUM_PRINT_WIDTH) {
+  size_t exp, pow, div;
+
+  if (*nchars == BC_NUM_PRINT_WIDTH - 1) {
     if (fputc('\\', f) == EOF) return BC_STATUS_IO_ERR;
     if (fputc('\n', f) == EOF) return BC_STATUS_IO_ERR;
     *nchars = 0;
   }
-  else {
-    if (fputc(radix ? '.' : ' ', f) == EOF) return BC_STATUS_IO_ERR;
-    ++(*nchars);
+
+  if (fputc(radix ? '.' : ' ', f) == EOF) return BC_STATUS_IO_ERR;
+  ++(*nchars);
+
+  for (exp = 0, pow = 1; exp < width - 1; ++exp, pow *= 10);
+
+  for (; pow; pow /= 10, ++(*nchars)) {
+
+    if (*nchars == BC_NUM_PRINT_WIDTH - 1) {
+      if (fputc('\\', f) == EOF) return BC_STATUS_IO_ERR;
+      if (fputc('\n', f) == EOF) return BC_STATUS_IO_ERR;
+      *nchars = 0;
+    }
+
+    div = num / pow;
+    if (fputc(((char) div) + '0', f) == EOF) return BC_STATUS_IO_ERR;
+    num -= div * pow;
   }
 
-  if (fprintf(f, "%0*lu", (unsigned int) width, num) < 0)
-    return BC_STATUS_IO_ERR;
-
-  *nchars = *nchars + width;
-
   return BC_STATUS_SUCCESS;
 }