Skip to content

Commit 1ef308e

Browse files
committed
Initial commit of the book as a pdf and the source codes
1 parent 7dfd0b6 commit 1ef308e

File tree

220 files changed

+12454
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

220 files changed

+12454
-0
lines changed
Binary file not shown.

‎sources/chapter01/base.c

+137
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,137 @@
1+
#define EPS 0.0001
2+
#define MAX_LEN 100
3+
4+
#include <assert.h>
5+
#include <math.h>
6+
#include <stdio.h>
7+
#include <string.h>
8+
9+
char getChar(char n) /* Âðúùà ñèìâîëà, ñúîòâåòñòâàù íà n */
10+
{ return (n < 10) ? n + '0' : n + 'A' - 10; }
11+
12+
char getValue(char c) /* Âðúùà ñòîéíîñòòà íà ñèìâîëà c */
13+
{ return (c >= '0' && c <= '9') ? c - '0' : c - 'A' + 10; }
14+
15+
void reverse(char *pch)
16+
{ char *pEnd;
17+
for (pEnd = pch + strlen(pch) - 1; pch < pEnd; pch++, pEnd--) {
18+
char c = *pch;
19+
*pch = *pEnd;
20+
*pEnd = c;
21+
}
22+
}
23+
24+
void convert(char *rslt, unsigned long n, unsigned char base)
25+
/* Ïðåîáðàçóâà öÿëîòî äåñåòè÷íî ÷èñëî n (n >= 0) â áðîéíà ñèñòåìà ñ îñíîâà base */
26+
{ char *saveRslt = rslt;
27+
while (n > 0) {
28+
*rslt++ = getChar((char)(n % base));
29+
n /= base;
30+
}
31+
*rslt = '\0';
32+
reverse(saveRslt);
33+
}
34+
35+
void convertLessThan1(char *rslt, double n, unsigned char base, unsigned char cnt)
36+
/* Ïðåîáðàçóâà äåñåòè÷íîòî ÷èñëî 0 <= n < 1 â áðîéíà ñèñòåìà ñ îñíîâà base
37+
ñ íå ïîâå÷å îò cnt íà áðîé öèôðè ñëåä äåñåòè÷íàòà çàïåòàÿ */
38+
{
39+
while (cnt--) {
40+
/* Äàëè íå ñìå ïîëó÷èëè 0? */
41+
if (fabs(n) < EPS) break;
42+
/* Ïîëó÷àâàíå íà ñëåäâàùàòà öèôðà */
43+
n *= base;
44+
*rslt++ = getChar((char)(int)floor(n));
45+
n -= floor(n);
46+
}
47+
*rslt = '\0';
48+
}
49+
50+
void convertReal(char *rslt, double n, unsigned char base, unsigned char cnt)
51+
/* Ïðåîáðàçóâà äåñåòè÷íîòî ðåàëíî ÷èñëî n â áðîéíà ñèñòåìà ñ îñíîâà base */
52+
{ double integer, fraction;
53+
54+
/* Íàìèðàíå íà çíàêà */
55+
if (n < 0) {
56+
*rslt++ = '-';
57+
n = -n;
58+
}
59+
60+
/* Ðàçáèâàíå íà öÿëà è äðîáíà ÷àñò */
61+
fraction = modf(n, &integer);
62+
63+
/* Êîíâåðòèðàíå íà öÿëàòà ÷àñò */
64+
convert(rslt, (unsigned long)integer, base);
65+
66+
/* Ïîñòàâÿíå íà äåñåòè÷íà òî÷êà */
67+
if ('\0' == *rslt)
68+
*rslt++ = '0';
69+
else
70+
rslt += strlen(rslt);
71+
*rslt++ = '.';
72+
73+
/* Êîíâåðòèðàíå íà äðîáíàòà ÷àñò */
74+
convertLessThan1(rslt, fraction, base, cnt);
75+
if ('\0' == *rslt) {
76+
*rslt++ = '0';
77+
*rslt = '\0';
78+
}
79+
}
80+
81+
unsigned long calculate(const char *numb, unsigned char base)
82+
/* Íàìèðà äåñåòè÷íàòà ñòîéíîñò íà ÷èñëîòî numb, çàäàäåíî â áðîéíà ñèñòåìà
83+
ñ îñíîâà base, numb >= 0 */
84+
{ unsigned long result;
85+
for (result = 0; '\0' != *numb; numb++)
86+
result = result*base + getValue(*numb);
87+
return result;
88+
}
89+
90+
double calculateLessThan1(const char *numb, unsigned char base)
91+
/* Íàìèðà äåñåòè÷íàòà ñòîéíîñò íà ÷èñëîòî numb (0 < numb < 1),
92+
çàäàäåíî â áðîéíà ñèñòåìà ñ îñíîâà base */
93+
{ const char *end;
94+
double result;
95+
for (end = numb + strlen(numb) - 1, result = 0.0; end >= numb; end--)
96+
result = (result + getValue(*end)) / base;
97+
return result;
98+
}
99+
100+
double calculateReal(char *numb, unsigned char base)
101+
/* Íàìèðà äåñåòè÷íàòà ñòîéíîñò íà ðåàëíîòî ÷èñëî numb, çàäàäåíî
102+
â áðîéíà ñèñòåìà ñ îñíîâà base */
103+
{ char *pointPos;
104+
char minus;
105+
double result;
106+
107+
/* Ïðîâåðêà çà ìèíóñ */
108+
if ('-' == *numb) {
109+
minus = -1;
110+
numb++;
111+
}
112+
else
113+
minus = 1;
114+
115+
if (NULL == (pointPos = strchr(numb, '.')))
116+
return calculate(numb, base); /* Íÿìà äðîáíà ÷àñò */
117+
118+
/* Ïðåñìÿòàíå íà öÿëàòà ÷àñò */
119+
*pointPos = '\0';
120+
result = calculate(numb, base);
121+
*pointPos = '.';
122+
123+
/* Ïðèáàâÿíå íà äðîáíàòà ÷àñò */
124+
result += calculateLessThan1(pointPos+1, base);
125+
126+
return minus*result;
127+
128+
}
129+
130+
int main(void) {
131+
char numb[MAX_LEN];
132+
printf("!!! Äåìîíñòðàöèÿ íà ïðåîáðàçóâàíåòî ìåæäó áðîéíè ñèñòåìè !!!\n");
133+
convertReal(numb, 777.777, 7, 10); printf("Ñåäìè÷íèÿò çàïèñ íà 777.777 (10) å %s\n", numb);
134+
strcpy(numb,"11.D873");
135+
printf("Äåñåòè÷íèÿò çàïèñ íà 11.D873 (16) å: %0.10lf\n",calculateReal(numb,16));
136+
return 0;
137+
}

‎sources/chapter01/bell.c

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#include <stdio.h>
2+
3+
#define MAXN 100
4+
5+
const unsigned long n = 10;
6+
7+
unsigned long M[MAXN+1];
8+
void stirling(unsigned n)
9+
{ unsigned i, j;
10+
if (n == 0) M[0] = 1;
11+
else M[0] = 0;
12+
for (i = 1; i <= n; i++) {
13+
M[i] = 1;
14+
for (j = i - 1; j >= 1; j--) M[j] = j * M[j] + M[j - 1];
15+
}
16+
}
17+
18+
unsigned long bell(unsigned n)
19+
{ unsigned i;
20+
unsigned long result = 0;
21+
for (i = 0; i <= n; i++) result += M[i];
22+
return result;
23+
}
24+
25+
int main(void) {
26+
stirling(n);
27+
printf("bell(%lu)= %lu\n", n, bell(n));
28+
return 0;
29+
}

‎sources/chapter01/cnk.c

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include <stdio.h>
2+
3+
#define MAXN 500
4+
5+
unsigned long n = 7;
6+
unsigned long k = 3;
7+
8+
unsigned long pN, primes[MAXN], counts[MAXN];
9+
10+
void modify(long int x, int how)
11+
{ unsigned i;
12+
for (i = 0; i < pN; i++)
13+
if (x == primes[i]) { counts[i] += how; return; }
14+
counts[pN] = how;
15+
primes[pN++] = x;
16+
}
17+
18+
void solve(unsigned long start, unsigned long end, unsigned long inc)
19+
{ unsigned long prime, mul, how, i, max;
20+
for (i = start; i <= end; i++) {
21+
mul = i;
22+
prime = 2;
23+
while (mul != 1) {
24+
for (how = 0; mul % prime == 0; mul /= prime, how++);
25+
if (how > 0) modify(prime, inc * how);
26+
prime++;
27+
}
28+
}
29+
}
30+
31+
long int calc(void)
32+
{ int i, j;
33+
long int result = 1;
34+
for (i = 0; i < pN; i++)
35+
for (j = 0; j < counts[i]; j++) result *= primes[i];
36+
return result;
37+
}
38+
39+
int main(void) {
40+
printf("C(%lu,%lu)= ", n, k);
41+
pN = 0;
42+
if (n - k < k) k = n - k;
43+
solve(n - k + 1, n, 1); /* Ôàêòîðèçèðà ÷èñëèòåëÿ (n–k+1),...,n */
44+
solve(1, k, -1); /* Ôàêòîðèçèðà çíàìåíàòåëÿ 1,...,k */
45+
printf("%lu\n", calc());
46+
return 0;
47+
}
48+

‎sources/chapter01/codeperm.c

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#include <stdio.h>
2+
3+
#define MAXN 100
4+
5+
const unsigned n = 6;
6+
const unsigned perm[MAXN] = { 5, 3, 6, 4, 2, 1 };
7+
const unsigned long code = 551;
8+
9+
unsigned long codePerm(unsigned n, unsigned perm[])
10+
{ unsigned p[MAXN], i, pos;
11+
unsigned long r, result;
12+
result = 0;
13+
for (i = 0; i < n; i++) p[i] = i + 1;
14+
for (pos = 0; pos < n; pos++) {
15+
r = 0;
16+
while (perm[pos] != p[r]) r++;
17+
result = result * (n - pos) + r;
18+
for (i = r + 1; i < n; i++) p[i - 1] = p[i];
19+
}
20+
return result;
21+
}
22+
23+
void decodePerm(unsigned long num, unsigned n, unsigned perm[])
24+
{ unsigned long r, m, k;
25+
unsigned i, p[MAXN];
26+
for (i = 0; i < n; i++) p[i] = i + 1;
27+
k = n;
28+
do {
29+
m = n - k + 1;
30+
perm[k - 1] = num % m;
31+
if (k > 1) num /= m;
32+
} while (--k > 0);
33+
k = 0;
34+
do {
35+
m = perm[k]; perm[k] = p[m];
36+
if (k < n)
37+
for (i = m + 1; i < n; i++) p[i - 1] = p[i];
38+
} while (++k < n);
39+
}
40+
41+
int main(void) {
42+
unsigned i;
43+
printf("Äàäåíàòà ïåðìóòàöèÿ ñå êîäèðà êàòî %lu \n", codePerm(n, perm));
44+
printf("Äåêîäèðàìå ïåðìóòàöèÿòà îòãîâàðÿùà íà ÷èñëîòî %lu: ", code);
45+
decodePerm(code, n, perm);
46+
for (i = 0; i < n; i++) printf("%u ", perm[i]);
47+
printf("\n");
48+
return 0;
49+
}

‎sources/chapter01/comb.c

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include <stdio.h>
2+
3+
/* comment */
4+
#define MAXN 20
5+
6+
/* Íàìèðà âñè÷êè êîìáèíàöèè íà n åëåìåíòà îò k-òè êëàñ */
7+
const unsigned n = 5;
8+
const unsigned k = 3;
9+
10+
unsigned mp[MAXN];
11+
12+
void print(unsigned length)
13+
{ unsigned i;
14+
for (i = 0; i < length; i++) printf("%u ", mp[i]);
15+
printf("\n");
16+
}
17+
18+
void komb(unsigned i, unsigned after)
19+
{ unsigned j;
20+
if (i > k) return;
21+
for (j = after + 1; j <= n; j++) {
22+
mp[i - 1] = j;
23+
if (i == k) print(i);
24+
komb(i + 1, j);
25+
}
26+
}
27+
28+
int main(void) {
29+
printf("C(%u,%u): \n", n, k);
30+
komb(1, 0);
31+
return 0;
32+
}
33+

‎sources/chapter01/devnum.c

+35
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#include <stdio.h>
2+
3+
#define MAXN 100
4+
5+
const unsigned n = 7;
6+
7+
unsigned mp[MAXN + 1];
8+
9+
void print(unsigned length)
10+
{ unsigned i;
11+
for (i = 1; i < length; i++) printf("%u+", mp[i]);
12+
printf("%u\n", mp[length]);
13+
}
14+
15+
void devNum(unsigned n, unsigned pos)
16+
{ unsigned k;
17+
for (k = n; k >= 1; k--) {
18+
if (n != k) {
19+
mp[pos] = k;
20+
if (mp[pos] <= mp[pos - 1]) {
21+
devNum(n - k, pos + 1);
22+
}
23+
}
24+
else {
25+
mp[pos] = k;
26+
if (mp[pos] <= mp[pos - 1]) print(pos);
27+
}
28+
}
29+
}
30+
31+
int main(void) {
32+
mp[0] = n+1;
33+
devNum(n, 1);
34+
return 0;
35+
}

‎sources/chapter01/devnum2.c

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#include <stdio.h>
2+
3+
/* Ìàêñèìàëåí áðîé íà ìíîæèòåëèòå, íàé-ìíîãî log2n (ìèíèìàëíèÿò å 2). */
4+
#define MAXLN 20
5+
6+
/* ×èñëî, êîåòî ùå ðàçáèðàìå */
7+
const unsigned n = 50;
8+
9+
unsigned mp[MAXLN];
10+
11+
void print(unsigned length)
12+
{ unsigned i;
13+
for (i = 1; i < length; i++) printf("%u * ", mp[i]);
14+
printf("%d\n", mp[length]);
15+
}
16+
17+
void devNum(unsigned n, unsigned pos)
18+
{ unsigned k;
19+
for (k = n; k > 1; k--) {
20+
if (n != k) {
21+
mp[pos] = k;
22+
if (mp[pos] <= mp[pos - 1])
23+
if (n % k == 0) devNum(n / k, pos + 1);
24+
}
25+
else {
26+
mp[pos] = k;
27+
if (mp[pos] <= mp[pos - 1]) print(pos);
28+
}
29+
}
30+
}
31+
32+
int main(void) {
33+
mp[0] = n + 1;
34+
devNum(n, 1);
35+
return 0;
36+
}

0 commit comments

Comments
 (0)