云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > 算法设计与分析(第2版) 王红梅 胡明 习题答案

算法设计与分析(第2版) 王红梅 胡明 习题答案

  • 62 次阅读
  • 3 次下载
  • 2025/6/4 19:03:30

习题3

1. 假设在文本\中查找模式\,写出分别采用BF算法和KMP

算法的串匹配过

//BF算法

#include using namespace std;

int BF(char S[], char T[]) {

int index = 0; int i = 0, j = 0; while ((S[i] != '\\0') && (T[j] != '\\0')) {

if (S[i] == T[j]) { i++; j++; } else { ++index; i = index; j = 0; } }

if (T[j] == '\\0') return index + 1; else return 0; }

int main() { char s1[19]=\

char s2[7]=\

cout<< BF( s1, s2) <

//KMP算法

#include using namespace std;

void GetNext(char T[ ], int next[ ]) //求模式T的next值 {

int i, j, len; next[0] = -1;

for (j = 1; T[j]!='\\0'; j++) //依次求next[j] {

for (len = j - 1; len >= 1; len--) //相等子串的最大长度为j-1 { for (i = 0; i < len; i++) //依次比较T[0]~T[len-1]与T[j-len]~T[j-1] if (T[i] != T[j-len+i]) break; if (i == len) { next[j] = len; break; } }//for if (len < 1)

next[j] = 0; //其他情况,无相等子串 }//for }

int KMP(char S[ ], char T[ ]) //求T在S中的序号 {

int i = 0, j = 0;

int next[80]; //假定模式最长为80个字符 GetNext(T, next);

while (S[i] != '\\0' && T[j] != '\\0') {

if (S[i] == T[j]) {

i++; j++; }

else { j = next[j]; if (j == -1) {i++; j++;}

} }

if (T[j] == '\\0') return (i - strlen(T) +1); //返回本趟匹配的开始位置 else return 0; }

int main() { char s1[]=\ char s2[]=\

cout<

return 0; }

2.分式化简。设计算法,将一个给定的真分数化简为最简分数形式。例如,将6/8化简为3/4。

#include using namespace std;

int main() {

int n;//分子 int m;//分母

int factor;//最大公因子 int factor1;

cout<<\输入一个真分数的分子与分母: \ cin>>n>>m;

int r = m % n;//因为是真分数 所以分母一定大于分子 factor1=m; factor=n; while (r != 0) {

factor1 =factor; factor = r;

r = factor1% factor; }

cout<<\输出该真分数的最简分数: \return 0; }

3. 设计算法,判断一个大整数能否被11整除。可以通过以下方法:将该数的十进制表示

从右端开始,每两位一组构成一个整数,然后将这些数相加,判断其和能否被11整除。例如,将562843748分割成5,62,84,37,48,然后判断(5+62+84+37+48)能否被11整除 //将一个大整数看成一个数组

//数组的奇数位对应数的10倍加上数组偶数对应数的本身 //验证结果能否被11整除

#include using namespace std;

int main() { int a[9]={5,6,2,8,4,3,7,4,8}; int result=0; //result为题目要求的各位之和 for(int i=0;i!=9;++i) { if(i%2==0) result+=a[i]; //i 为偶数位时,结果加上其对应数组数的本身 else result+=a[i]*10; //i 为奇数位时,结果加上对应数组数的10倍 } if(result==0) cout<<\该整数能被11整除\ else

cout<<\该整数不能被11整除\ return 0; }

4. 数字游戏。把数字 1,2,?,9这9个数字填入以下含有加、减、乘、除的四则运算式中,使得该等式成立。要求9个数字均出现一次且仅出现一次,且数字1不能出现在乘和除的一位数中(即排除运算式中一位数为1的平凡情形)。

??×?+???÷?-?? = 0

  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

习题3 1. 假设在文本\中查找模式\,写出分别采用BF算法和KMP算法的串匹配过 //BF算法 #include using namespace std; int BF(char S[], char T[]) { int index = 0; int i = 0, j = 0; while ((S[i] != '\\0') && (T[j] != '\\0')) { if (S[i] == T[j]) { i++; j++; }

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com