Blame


1 5dc21454 2023-07-14 jrmu /*
2 5dc21454 2023-07-14 jrmu * Exercise 3-5. Write the function itob(n,s,b) that converts the integer n
3 5dc21454 2023-07-14 jrmu * into a base b character representation in the string s. In particular,
4 5dc21454 2023-07-14 jrmu * itob(n,s,16) formats n tas a hexadecimal integer in s.
5 5dc21454 2023-07-14 jrmu */
6 5dc21454 2023-07-14 jrmu
7 5dc21454 2023-07-14 jrmu #include <stdio.h>
8 5dc21454 2023-07-14 jrmu #include <stdlib.h>
9 5dc21454 2023-07-14 jrmu #include <limits.h>
10 5dc21454 2023-07-14 jrmu #include <string.h>
11 5dc21454 2023-07-14 jrmu
12 5dc21454 2023-07-14 jrmu int pow(int x, int n) {
13 5dc21454 2023-07-14 jrmu int val;
14 5dc21454 2023-07-14 jrmu for (val = 1; n > 0; n--) {
15 5dc21454 2023-07-14 jrmu val *= x;
16 5dc21454 2023-07-14 jrmu }
17 5dc21454 2023-07-14 jrmu return val;
18 5dc21454 2023-07-14 jrmu }
19 5dc21454 2023-07-14 jrmu int itob(int n, char *s, int b) {
20 5dc21454 2023-07-14 jrmu char *tr = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
21 5dc21454 2023-07-14 jrmu int digits;
22 5dc21454 2023-07-14 jrmu for (digits = 0; pow(b,digits) <= n; digits++)
23 5dc21454 2023-07-14 jrmu ;
24 5dc21454 2023-07-14 jrmu for (int i = digits-1; i >= 0; i--) {
25 5dc21454 2023-07-14 jrmu int times = (n/pow(b,i));
26 5dc21454 2023-07-14 jrmu *s++ = *(tr + times);
27 5dc21454 2023-07-14 jrmu n -= times * pow(b,i);
28 5dc21454 2023-07-14 jrmu }
29 5dc21454 2023-07-14 jrmu *s = '\0';
30 5dc21454 2023-07-14 jrmu return 0;
31 5dc21454 2023-07-14 jrmu }
32 5dc21454 2023-07-14 jrmu int assert(char *expect, char *actual) {
33 5dc21454 2023-07-14 jrmu printf("Expect: %s\n", expect);
34 5dc21454 2023-07-14 jrmu printf("Actual: %s\n", actual);
35 5dc21454 2023-07-14 jrmu return strcmp(expect, actual);
36 5dc21454 2023-07-14 jrmu }
37 5dc21454 2023-07-14 jrmu int main() {
38 5dc21454 2023-07-14 jrmu char s[100];
39 5dc21454 2023-07-14 jrmu char *t;
40 5dc21454 2023-07-14 jrmu sprintf(t, "%d", pow(9,9));
41 5dc21454 2023-07-14 jrmu assert("387420489", t);
42 5dc21454 2023-07-14 jrmu itob(1208, s, 26);
43 5dc21454 2023-07-14 jrmu assert("1KC", s);
44 5dc21454 2023-07-14 jrmu itob(5763, s, 16);
45 5dc21454 2023-07-14 jrmu assert("1683", s);
46 5dc21454 2023-07-14 jrmu itob(194200, s, 8);
47 5dc21454 2023-07-14 jrmu assert("573230", s);
48 5dc21454 2023-07-14 jrmu itob(2, s, 8);
49 5dc21454 2023-07-14 jrmu assert("2", s);
50 5dc21454 2023-07-14 jrmu itob(8, s, 2);
51 5dc21454 2023-07-14 jrmu assert("1000", s);
52 5dc21454 2023-07-14 jrmu itob(93, s, 2);
53 5dc21454 2023-07-14 jrmu assert("1011101", s);
54 5dc21454 2023-07-14 jrmu /*
55 5dc21454 2023-07-14 jrmu * overflow issues
56 5dc21454 2023-07-14 jrmu sprintf(t, "%x", INT_MAX);
57 5dc21454 2023-07-14 jrmu itob(INT_MAX, s, 16);
58 5dc21454 2023-07-14 jrmu assert(t, s);
59 5dc21454 2023-07-14 jrmu */
60 5dc21454 2023-07-14 jrmu }
61 5dc21454 2023-07-14 jrmu
62 5dc21454 2023-07-14 jrmu /*
63 5dc21454 2023-07-14 jrmu * thought process:
64 5dc21454 2023-07-14 jrmu * 1208/26
65 5dc21454 2023-07-14 jrmu * 46.46153846153846153846
66 5dc21454 2023-07-14 jrmu * too big, repeat division
67 5dc21454 2023-07-14 jrmu * 1208/26/26
68 5dc21454 2023-07-14 jrmu * 1.78698224852071005917
69 5dc21454 2023-07-14 jrmu * base 26: 0100
70 5dc21454 2023-07-14 jrmu * 1 + modulo
71 5dc21454 2023-07-14 jrmu * 26*26 = 676
72 5dc21454 2023-07-14 jrmu * 1208 - 676 = 532
73 5dc21454 2023-07-14 jrmu * 532 / 26 = 20
74 5dc21454 2023-07-14 jrmu * lookup 20 (char 9abcdefghijk)
75 5dc21454 2023-07-14 jrmu * base 26: 01k0 + modulo
76 5dc21454 2023-07-14 jrmu * 532 - 20*26 = 12
77 5dc21454 2023-07-14 jrmu * lookup 20 (char c)
78 5dc21454 2023-07-14 jrmu * base 26: 01kc
79 5dc21454 2023-07-14 jrmu * 5763/16 = 360.18
80 5dc21454 2023-07-14 jrmu * too big, repeat division
81 5dc21454 2023-07-14 jrmu * 5763/16/16 = 22.511
82 5dc21454 2023-07-14 jrmu * too big, repeat division
83 5dc21454 2023-07-14 jrmu * 5763/16/16/16 = 1.406
84 5dc21454 2023-07-14 jrmu * base 16: 1 + modulo
85 5dc21454 2023-07-14 jrmu * 5763-1*16*16*16 = 1667
86 5dc21454 2023-07-14 jrmu * 1667/16/16 = 6.5117
87 5dc21454 2023-07-14 jrmu * 1667-6*16*16 = 131
88 5dc21454 2023-07-14 jrmu * base 16: 16 + modulo
89 5dc21454 2023-07-14 jrmu * 131/16 = 8.1875
90 5dc21454 2023-07-14 jrmu * 131-8*16 = 3
91 5dc21454 2023-07-14 jrmu * base 16: 163
92 5dc21454 2023-07-14 jrmu * 194200/8/8/8/8/8 = 5.926
93 5dc21454 2023-07-14 jrmu * 194200 - 5*8^5 = 30360
94 5dc21454 2023-07-14 jrmu * 30360/8/8/8/8 = 7.41
95 5dc21454 2023-07-14 jrmu * 30360 - 7*8^4 = 1688
96 5dc21454 2023-07-14 jrmu * 1688/8/8/8 = 3.2968
97 5dc21454 2023-07-14 jrmu * 1688 - 3*8^3 = 152
98 5dc21454 2023-07-14 jrmu * 152/8/8 = 2.375
99 5dc21454 2023-07-14 jrmu * 152 - 2*8^2 = 24
100 5dc21454 2023-07-14 jrmu * 24/8 = 3
101 5dc21454 2023-07-14 jrmu * base 8: 573230
102 5dc21454 2023-07-14 jrmu */
103 5dc21454 2023-07-14 jrmu
104 5dc21454 2023-07-14 jrmu /*
105 5dc21454 2023-07-14 jrmu itob(INT_MIN, s, 2);
106 5dc21454 2023-07-14 jrmu printf("Expect: %s\n", "");
107 5dc21454 2023-07-14 jrmu printf("Actual: %s\n", s);
108 5dc21454 2023-07-14 jrmu itob(-5, s, 8);
109 5dc21454 2023-07-14 jrmu printf("Expect: %s\n", "");
110 5dc21454 2023-07-14 jrmu printf("Actual: %s\n", s);
111 5dc21454 2023-07-14 jrmu */
112 5dc21454 2023-07-14 jrmu