文章目录

  • 第四章-筛法与查找
    • 4.1 插花游戏
      • 笔记
      • 代码实现
    • 4.2 筛法
      • 笔记
      • 4.2.3 代码实现
      • 4.2.5 代码实现
      • 4.2.7 代码实现
      • 4.2.7 韩信点兵问题的数学理解
    • 4.3 线性查找
      • 笔记
      • 4.3.2 代码实现
      • 4.3.4 代码实现
    • 4.4 折半查找
      • 笔记
      • 代码实现
    • 4.5 排序问题
      • 笔记
      • 4.5.1 代码实现
      • 4.5.1 代码简化
      • 4.5.2 代码实现
      • 4.5.3 代码实现
      • 4.5.3 代码拓展
      • 4.5.4 代码实现
    • 语法自测-试题答案

第四章-筛法与查找

4.1 插花游戏

笔记

  函数(function)是一个具有特定的功能的、相对独立的模块,能够被多次使用
  函数设计的要素:

 功能:函数的定义(definition)模块:函数的声明(declaration)-->函数名,输入类型,输出类型使用:函数的调用(call)

  

代码实现

#include <iostream>
using namespace std;bool isPrime(int);int main()
{for (int n = 2; n <= 100; n++)if (isPrime(n))cout << n <<endl;return 0;
}bool isPrime(int n)
{for (int i = 2; i*i <= n; i++)if (n % i == 0)return false;return true;
}

4.2 筛法

笔记

  数组定义:数组的类型,数组的名称,变量的个数;
  筛法思路:埃拉托斯特尼筛法

 初始化“筛子”-->枚举-->用筛子筛选

4.2.3 代码实现

#include <iostream>
using namespace std;const int N=100;
bool seive[N+1];int main()
{for (int i = 2; i <= N; i++)seive[i] = true;for (int d = 2; d*d <= N; d++)if (seive[d])for (int n = d*d; n <= N; n +=d)seive[n] = false;for (int n =2; n <= N; n++)if (seive[n])cout << n <<endl;return 0;
}

4.2.5 代码实现

#include <iostream>
using namespace std;int main()
{int r3 = 0, r5 = 0, r7 = 0;int seive[200];cin >> r3 >> r5 >> r7;for (int i = 0; i < 200; i++)seive[i] = 0;for (int i = r3; i < 200; i = i + 3)seive[i]++;for (int i = r5; i < 200; i = i + 5)seive[i]++;for (int i = r7; i < 200; i = i + 7)seive[i]++;for (int i = 0; i < 200; i++)if (seive[i] == 3)cout << i <<endl;return 0;
}

注意:循环中的 i 需要 小于 数组中变量个数,因为200个变量的数组最后一个位seive[199]

4.2.7 代码实现

#include <iostream>
using namespace std;int main()
{int r3 = 0, r5 = 0, r7 = 0;cin >> r3 >> r5 >> r7;int res =  (r3 * 70 + r5 * 21 + r7 * 15) % 105;cout << res <<endl;return 0;
}

4.2.7 韩信点兵问题的数学理解

  • 能被 5,7 除尽数是 35k,其中 k=2,即70除3正好余1,70a 除3正好余a。
  • 能被 3,7 除尽数是 21k,其中 k=1,即21除5正好余1,21b 除5正好余b。
  • 能被 3,5 除尽数是 15k,其中 k=1,即15除7正好余1,15c 除7正好余c。

所以

  • 70a + 21b + 15c 除3正好余a。
  • 70a + 21b + 15c 除5正好余b。
  • 70a + 21b + 15c 除7正好余c。

所以
(70a + 21b + 15c)%(3 * 5 * 7)为最小值

以上内容摘自网络

4.3 线性查找

笔记

  线性查找:扑克牌问题

 初始化-->枚举-->判定查找-->找到跳出-->输出

  查找最小值/最大值:

 初始化-->枚举-->判定查找-->更新判定值-->输出

4.3.2 代码实现

#include <iostream>
using namespace std;int main()
{int cards[13] = {101,112,109,107,202,209,213,212,313,303,403,412,402};int pos = -1;for (int i =0; i < 13; i++)if (cards[i] == 112){pos = i;break;}if (pos != -1)cout << "黑桃Q是第" << pos + 1 << "张牌" <<endl;else cout << "没找到" <<endl; return 0;
}

4.3.4 代码实现

#include <iostream>
using namespace std;int main()
{int cards[13] = {101,112,109,107,202,209,213,212,313,303,403,412,402};int last_card = 7;int min = 14;int pos = -1;for (int i =0; i < 13; i++)if ((cards[i] % 100) > 7)if ((cards[i] % 100) < min){pos = i;min = cards[i] % 100;}if (pos != -1)cout << "比" << last_card << "大的最小牌是第" << pos + 1 << "张牌" <<endl;else cout << "没找到" <<endl; return 0;
}

注意到,本例中有两张 9 均符合结果,判定为 小于 所以输出的是第一个符合条件的牌的位置

4.4 折半查找

笔记

  已知查找目标是有序排列
  选择目标最中间的数据作为判定目标,每次判定筛选掉一半数据,所以是折半查找

 初始化-->选取中间数据判定-->找到跳出,未找到更新范围-->范围内无牌-->输出

代码实现

#include <iostream>
using namespace std;int main()
{int target_card = 112; int cards[13] = {101,107,109,112,202,209,212,213,303,313,402,403,412};int pos = -1;int low = 0, high = 12;while (low <= high){int middle = (low + high) / 2;if (cards[middle] == target_card){pos = middle;break;}else if (cards[middle] > target_card)high = middle -1;elselow = middle +1;}if (pos != -1)cout << target_card << "是第" << pos + 1 << "张牌" <<endl;else cout << "没找到" <<endl; return 0;
}

4.5 排序问题

笔记

  插入排序:将第 i 个元素 插入 之前的数据中的比自己大的数据之前
  选择排序: 选取 第 i 个之后的最小值放在 i 的位置
  折半插入排序:在插入排序中,第 i 个元素之前的数据已经被排序,所以进行插入时可以使用折半查找

4.5.1 代码实现

//插入排序
#include <iostream>
using namespace std;int main()
{int cards[13] = {101,112,109,107,202,209,213,212,313,303,403,412,402};for (int i =0; i < 13; i++){int pos = -1, min = 500, target = cards[i];for (int j = 0; j < i; j++)if(cards[j] > target)if(cards[j] < min){min = cards[j];pos = j;}if (pos != -1){for (int j = i; j >pos; j--)cards[j] = cards[j - 1];cards[pos] = target;}}for (int i =0; i < 13; i++)cout << cards[i] << " ";cout <<endl;return 0;
}

4.5.1 代码简化

  因为第 i 个数据之前的值,已经从小到大排列过,所以当按照顺序找到的第一个比 cards[i] 大的数时,这个数肯定是期望的最小数,所以可以简化掉对 min 的处理

for (int i =0; i < 13; i++){int pos = 0, target = cards[i];while (target > cards[pos])pos++;for (int j = i; j >pos; j--)cards[j] = cards[j - 1];cards[pos] = target;}

4.5.2 代码实现

//选择排序
#include <iostream>
using namespace std;int main()
{int cards[13] = {101,112,109,107,202,209,213,212,313,303,403,412,402};for (int i =0; i < 13; i++){int min = cards[i],pos = i;for (int j = i + 1; j < 13; j++)if (cards[j] < min){min = cards[j];pos = j;}cards[pos] = cards[i];cards[i] = min;}for (int i =0; i < 13; i++)cout << cards[i] << " ";cout <<endl;return 0;
}

4.5.3 代码实现

//函数写法
#include <iostream>
using namespace std;void insertsort(int cards[], int n);
void selectsort(int cards[], int n);int main()
{int cards[13] = {101,112,109,107,202,209,213,212,313,303,403,412,402};//  insertsort(cards, 13);selectsort(cards, sizeof(cards) / sizeof(int));for (int i =0; i < 13; i++)cout << cards[i] << " ";cout <<endl;return 0; return 0;
}void insertsort(int cards[], int n)
{for (int i =0; i < n; i++){int pos = 0, target = cards[i];while (target > cards[pos])pos++;for (int j = i; j >pos; j--)cards[j] = cards[j - 1];cards[pos] = target;}
}void selectsort(int cards[], int n)
{for (int i =0; i < n; i++){int min = cards[i],pos = i;for (int j = i + 1; j < n; j++)if (cards[j] < min){min = cards[j];pos = j;}cards[pos] = cards[i];cards[i] = min;}
}

4.5.3 代码拓展

  数组的长度,使用 sizeof() 提取数组长度,因为数组是一个 int 类型的数组,所以需要除以 sizeof(int) 才是最终的数组长度。

4.5.4 代码实现

//折半插入排序
#include <iostream>
using namespace std;int main()
{int cards[13] = {101,112,109,107,202,209,213,212,313,303,403,412,402};for (int i =0; i < 13; i++){int pos = -1,target = cards[i];int low = 0, high = i - 1;while (low <= high){int middle = (low + high) / 2;if((cards[middle] < target) && (cards[middle + 1] > target)){pos = middle + 1;break;}else if (cards[middle] > target)high = middle -1;elselow = middle +1;}if (pos != -1){for (int j = i; j >pos; j--)cards[j] = cards[j - 1];cards[pos] = target;}}for (int i =0; i < 13; i++)cout << cards[i] << " ";cout <<endl;return 0;
}

语法自测-试题答案





本题中 i-j 为负数

学堂在线-程序设计基础-第四章相关推荐

  1. 下楼问题(来源:学堂在线 程序设计基础)

    递归经典问题 题目描述 从楼上走到楼下共有h个台阶,每一步有3种走法:走一个台阶:走两个台阶:走三个台阶.规定只能往下走,不能往上走. 调皮的小明在n个台阶上撒了水,为了防止滑倒,不能踏上这n个台阶, ...

  2. 关于python语言和人工智能下哪个说法不正确_2020学堂云程序设计基础查题公众号...

    2020学堂云程序设计基础查题公众号 更新时间:2020-12-23 18:24点击: 2020学堂云程序设计基础查题公众号 更多相关问题 [单选题]()是指企业通过对顾客需求的估量和成本分析,选择一 ...

  3. 学堂在线疾风计划程序设计基础第1-4章

    学堂在线疾风计划程序设计基础 第一章 编程初步 牛刀小试 第二章 变量与代数思维 牛刀小试 逻辑推理与枚举解题 牛刀小试 运行没问题但是提交有问题,有知道原因的么,代码如下? 第四章 筛法与查找 牛刀 ...

  4. Python程序设计基础第七章笔记:字符串

    Python程序设计基础笔记 目录 Python程序设计基础笔记 第七章:文本处理(一):字符串 7.1 字符串编码格式简介 7.2 转义字符与原始字符串 7.3 字符串格式化 7.3.1 使用 % ...

  5. 微信小程序(第十四章) - 信息查询页面的实现

    微信小程序(第十四章)- 信息查询页面的实现 前言 页面标题实现 信息框的实现 页面结构实现 页面样式实现 学生到校离校信息查询列表实现 页面结构实现 页面样式实现 正在加载实现 页面结构实现 页面样 ...

  6. HTML+CSS+JavaScript网页制作案例教程-黑马程序员-第四章课后习题(播放器图标)

    黑马程序员编著的教材  HTML+CSS+JavaScript网页制作案例教程 第四章:播放器图标-课后习题参考代码 ........ 记得 关注,收藏,评论哦,作者将持续更新.... 我自己做的效果 ...

  7. windows 程序设计_windows程序设计基础(第二章)——2.5 第一个代码实例

    [例2-1]实现了一个简单的消息框,代码示例如下: #include <windows.h> ​ int APIENTRY WinMain(HINSTANCE hInstance,HINS ...

  8. Z-Wave 700应用程序框架第四章 - 从零开始一个Z-Wave Plus应用

    Z-Wave Plus应用程序的基本功能由设备类型和角色类型定义.为Z-Wave Plus应用程序确定设备类型和角色类型的正确组合是很重要的. 一旦确定了设备和角色类型,就可以开始应用程序开发. 1. ...

  9. PHP-----PHP程序设计基础教程----第二章PHP基本语法

    博文结构: 2.1 PHP语法风格 2.1.1 PHP标记 PHP有四种风格的标记,具体如表2-1所示: 表2-1 PHP开始和结束标记 标记类型 开始标记 结束标记 示例 说明 标准标记 <? ...

最新文章

  1. FPGA之道(61)时空变换之时间换空间
  2. Install matplotlib Error: src/ft2font.h:16:22: fatal error: ft2build.h: No such file or directory
  3. android微信小程序自动填表_微信小程序自动化,记录趟过的坑!
  4. 使用jQuery的hover事件在IE中不停闪动的解决方法
  5. WPF 文本框添加水印效果
  6. java发送会议邀请邮件模板_Spring 发送邮件 HTML邮件
  7. Java讲课笔记09:类与对象
  8. 表格嵌套_HTML |2| 表格与列表
  9. android studio应用开发案例,Android应用开发案例教程(Android Studio版).pptx
  10. arm64位的Centos7镜像安装JDK
  11. PLC Outstudio 使用教程
  12. 计算机网卡实现的功能,网卡实现的主要功能是什么
  13. ceph rbd mysql_Ceph实践之rbd
  14. 短途游成了携程、美团、抖音眼中的“香饽饽”?
  15. 微信朋友圈+html+字体颜色,改变微信聊天字体颜色的方法?
  16. 【xyplorer】通过右键新建word文件
  17. 啊哈添柴挑战Java1080. 请告诉我谁小?
  18. 如何在linux系统中安装虚拟机?
  19. 常用字写法(粤语)--(1)
  20. Win10 或者Win7 64位系统安装32位的CAD2010教程

热门文章

  1. window安装 Ubuntu子系统 和 fish
  2. 支付宝 口碑会员卡模板创建实例
  3. matlab实现二分法、牛顿法与割线法
  4. JSJ—编译器与虚拟机哪个重要?
  5. 用H5做直播网站源码,如何实现格式推流和播放
  6. everything_常用搜索语法/目录搜索(by offical doc/my examples)
  7. 上海各梯队IB学校怎么选?
  8. 头歌作业C语言数学运算练习题
  9. Romberg算法(Matlab实现)
  10. 如何解决token不刷新的问题