summaryrefslogtreecommitdiffstats
path: root/3/5.c
diff options
context:
space:
mode:
Diffstat (limited to '3/5.c')
-rw-r--r--3/5.c63
1 files changed, 63 insertions, 0 deletions
diff --git a/3/5.c b/3/5.c
new file mode 100644
index 0000000..b5c833e
--- /dev/null
+++ b/3/5.c
@@ -0,0 +1,63 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#define MAXLEN 100
+
+/* converts n to string in base b representation */
+void itob(int n, char s[], int b);
+
+int main(int argc, char *argv[]) {
+ int n, b, c, i;
+ char s[MAXLEN];
+
+ printf("Number: ");
+ for (i = 0; i < MAXLEN - 1 && (c = getchar()) != '\n' && c != EOF; i++)
+ s[i] = c;
+ s[i] = 0;
+ n = atoi(s);
+
+ printf("Base: ");
+ for (i = 0; i < MAXLEN - 1 && (c = getchar()) != '\n' && c != EOF; i++)
+ s[i] = c;
+ s[i] = 0;
+ b = atoi(s);
+
+ itob(n, s, b);
+ printf("%d in base %d: %s\n", n, b, s);
+
+ return 0;
+}
+
+void reverse(char s[]) {
+ int c, i, j;
+
+ for (i = 0, j = strlen(s) - 1; i < j; i++, j--) {
+ c = s[i];
+ s[i] = s[j];
+ s[j] = c;
+ }
+}
+
+void itob(int n, char s[], int b) {
+ int i, sign;
+
+ i = 0;
+ sign = n < 0;
+
+ if (n >= 0) {
+ do {
+ s[i++] = (n % b) + '0';
+ } while ((n /= b) > 0);
+ } else {
+ do {
+ s[i++] = -(n % b) + '0';
+ } while ((n /= b) <= -1);
+ }
+
+ if (sign)
+ s[i++] = '-';
+ s[i] = 0;
+
+ reverse(s);
+}