第1章 引论 - 练习解答

前言:全为本人自主解答,并非一定正确,如有错欢迎评论区指正

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. logX<X对所有X>0成立

b. log(A^{B}) = BlogA

a:当0<X\leqslant 1时显然成立,容易发现1<X\ \leqslant 2时也成立。假设命题对任意正整数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:令A=2^{X},则A^{B}=2^{XB}log(A^{B})=XB,BlogA=BX,所以log(A^{B})=BlogA

1.6 1.7 略

1.8 2^{100}(mod5)的值

2^1\equiv 2(mod5),2^2\equiv 4(mod5),2^3\equiv 3(mod5),2^4\equiv 1(mod5),再往后就是一直循环了。所以2^{100}\equiv (2^{4})^{25}(mod)\equiv 1^{25}(mod5),结果为1。

1.9 1.10略

本章涉及较多的数学,本人较懒就不给出证明了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值