前言:全为本人自主解答,并非一定正确,如有错欢迎评论区指正
1.1 编写一个程序解决选择问题
最简单的办法就是以递减顺序冒泡排序后,返回第k个元素。
int BubbleSort(int arr[], int size, int k)
{
int i, j, tmp;
for (i = 0; i < size - 1; i++)
for (j = size - 1; j > i; j--)
{
if (arr[j] > arr[j - 1])
{
tmp = arr[j];
arr[j] = arr[j - 1];
arr[j - 1] = tmp;
}
}
return arr[k];
}
1.2 编写一个程序求解字谜游戏问题
下面给出伪代码,WordsList是结构体类型,里面含有单词的数组和记录字谜中是否有这个单词的变量known,初始为false,L存放的是结构体数组的首地址,其实也就是单词表的首地址。利用 i和j遍历字符数组,遍历到每个字符时检查8个方向,行有左右,列有上下,对角线有右下 左上 右上 左下。检查每一个方向时都记录下来,然后跟单词表里的单词对比,如果相同则说明字谜中有这个单词,将结构体里的known改为True。
void FindWords(char arr[ROW][LINE], WordsList* L)
{
int i, j, k, m, n;
for (i = 0; i < ROW; i++)
for (j = 0; j < LINE; j++)
{
//check row
for (m = j; m < LINE; m++)
{
record each character as a word and check in the wordslist
}
for (m = j; m >= 0; m--)
{
record each character as a word and check in the wordslist
}
//check line
for (m = i; m < ROW; m++)
{
record each character as a word and check in the wordslist
}
for (m = i; m >= 0; m--)
{
record each character as a word and check in the wordslist
}
//check diagonal line
for (m = i, n = j; m < ROW && n < LINE; m++, n++)
{
record each character as a word and check in the wordslist
}
for (m = i, n = j; m >= 0 && n >= 0; m--, n--)
{
record each character as a word and check in the wordslist
}
for (m = i, n = j; m >= 0 && n <LINE; m--, n++)
{
record each character as a word and check in the wordslist
}
for (m = i, n = j; m < ROW && n >= 0; m++, n--)
{
record each character as a word and check in the wordslist
}
}
}
1.3 只使用处理 I/O 的PrintDigit 函数,编写一个程序可以输出任意实数(可以是负的)。
PrintDigit只能处理一个数字并输出,PrintOut用于输出任意实数。如下是两个函数的实现。我们如何来看待这个问题,就像书上所讲到的,当N为正整数时,输出一个例如"76315"的数,可以分为两步,输出"7631" 和 输出一个 "5",而前一个问题实际上和原问题是同一个问题 那么就是PrintOut来解决,7631也就是76315/10,即为PrintOut(N/10)。后一步用PrintDigit来解决,如此分解直到基准情形即需要输出"7"时,这时候不需要递归就能解决。类似地,当要输出负数时如"-45316",就是需要输出"-4531"和一个"6",6可用(-N%10)得到,当遇到基准情形-4时要不用递归就能解决。
void PrintDigit(int N)
{
if (N <= 9 && N >= -9)
printf("%d", N);
}
void PrintOut(int N)
{
if (N >= 10)
{
PrintOut(N / 10);
PrintDigit(N % 10);
}
if (N <= -10)
{
PrintOut(N / 10);
PrintDigit(-N % 10);
}
if (N >= -9 && N <= 9) //base case
PrintDigit(N);
}
1.4 略
1.5 证明下列公式:
a. 对所有
成立
b.
a:当时显然成立,容易发现
时也成立。假设命题对任意正整数p(p≥1),p < X ≤ 2p 时命题成立,求证对于任意的正整数p,2p < Y <= 4p命题成立。
证明:logY = log(2·Y/2) = log2 + log(Y/2) < 1 + Y/2 < (Y/2 + Y/2 = Y)。
即logY < Y成立。公式得证。
b:令,则
,
,所以
1.6 1.7 略
1.8 的值
,再往后就是一直循环了。所以
,结果为1。
1.9 1.10略
本章涉及较多的数学,本人较懒就不给出证明了。