第五章 基础题目选解

34
第第第 第第第第第第 09 计计计 计计计

Upload: francis-sargent

Post on 03-Jan-2016

48 views

Category:

Documents


7 download

DESCRIPTION

第五章 基础题目选解. 09 计算机 黎明明. 学习目标:. 1 、学会用常量表简化代码 2 、学会用状态变量辅助字符串读入 3 、学会用结构体定义高精度整数,并设计构造函数、复制构造函数和输入输出办法。 4 、学会为结构体定义“小于”运算符,并用它定义其他比较运算符 5 、掌握冒泡排序和顺序检索. 学习目标:. 6 、熟练掌握用 qsort 库函数给整数和字符串排序的方法。 7 、熟练掌握小规模素数表的构造方法 8 、熟练掌握素因子分解的办法。 9 、熟练掌握三角形有向面积的意义和计算办法 10 、完成一定数目的习题。. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第五章 基础题目选解

第五章 基础题目选解

09 计算机 黎明明

Page 2: 第五章 基础题目选解

学习目标:

1 、学会用常量表简化代码

2 、学会用状态变量辅助字符串读入

3 、学会用结构体定义高精度整数,并设计构造函数、复制构造函数和输入输出办法。

4 、学会为结构体定义“小于”运算符,并用它定义其他比较运算符

5 、掌握冒泡排序和顺序检索

Page 3: 第五章 基础题目选解

6 、熟练掌握用 qsort 库函数给整数和字符串排序的方法。

7 、熟练掌握小规模素数表的构造方法

8 、熟练掌握素因子分解的办法。

9 、熟练掌握三角形有向面积的意义和计算办法

10 、完成一定数目的习题。

学习目标:

Page 4: 第五章 基础题目选解

在算法比赛中,编程能力非常重要。算法设计得再好,如果不能在很短的时间里面实现出来也是白搭。这一章就是通过一些习题,让大家对一些小的编程技巧有所了解。为后面一些复杂的算法打基础。

Page 5: 第五章 基础题目选解

5.1 字符串

纯字符串的容易题大多数都是一看就知道怎么做,虽然思路简单但是实现却比较繁琐,如果不用一些小技巧来简化,那么代码量就会很大,而且很容易出小错误。

Page 6: 第五章 基础题目选解

习题 1 : 输入一个错位后敲出的字符串,输出打字员本来想打出的句子。

Page 7: 第五章 基础题目选解

如何做到题目要求的输入一个字符串?

Page 8: 第五章 基础题目选解

主要输入库函数:一次输入一个字符:scanf("< 格式化字符串 >" , < 地址表 >);getchar()getch一次输入一个字符数组 :scanf("< 格式化字符串 >" , < 地址表 >);gets()

C++cin

Page 9: 第五章 基础题目选解

1 、更广义的常量

2 、转义

3 、多种解法,代码长度不一样

4 、可以尝试 C++ 里面的 string

Page 10: 第五章 基础题目选解

习题 2 : TeX 括号 在 Tex 中,左括号是 `` ,右括号是’’。输入一篇包含双引号的文章,你的任务是把它转化为 TeX 格式

Page 11: 第五章 基础题目选解

习题 3 : 周期串 如果一个字符串可以由某个长度为 K 的字符串重复多次得到,我们就说该串以 K 为周期。例如, abcabcabcabc 以 3 位周期(注意,它也是以 6 和 12 为周期)。输入一个长度不超过 80 的穿,输入它的最小周期。样例输入:HoHoHo样例输入:2

Page 12: 第五章 基础题目选解

5.2 高精度 在介绍 C 语言时,大家已经看到很多整数溢出的情形。如果计算的结果真的很大,需要用所谓的高精度算法,用数组来存储整型,模拟手算的方法进行四则计算。

Page 13: 第五章 基础题目选解

习题 4 : 小学生算术

很多学生在学习加法时,发现“进位”特别容易出错。你的任务是计算两个整数的相加时需要多少次进位。你编制的程序应当可以处理连续多组数据,直到读到两个 0 (这是输入标记结束)。假设输入的整数都不超过 9 个数字。

Page 14: 第五章 基础题目选解

习题 5 阶乘的精确值

输入不超过 1000 的正整数 n ,输 n!=1*2*3…n 的精确解。

Page 15: 第五章 基础题目选解

习题 6 : 实现高精度类

Page 16: 第五章 基础题目选解

5.3 排序与检索

数据处理室计算机的强项,包括排序,检索统计等。这里举一些经典的例子。

Page 17: 第五章 基础题目选解

习题 7 : 6174问题 假设你有一个各位数字互不相同的四位数,把所有 数字从大到小排列后得到 a ,从小到大排序后得到 b ,然后用 a-b替换原来的数,并且继续操作,直到回到自己。

Page 18: 第五章 基础题目选解

冒泡排序思想:设想被排序的数组 R[1..N]垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组 R ,凡扫描到违反本原则的轻气泡,就使其向上 "漂浮 " ,如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。

Page 19: 第五章 基础题目选解

主要的排序办法:冒泡排序快速排序堆排序合并排序插入排序桶排序基数排序希尔排序

Page 20: 第五章 基础题目选解

快速排序

快速排序是竞赛中经常需要使用的算法,特别是高中的信息学比赛 ,可以说快速排序算法是必须非常熟悉的。而ACM 中可以使用 C,C++ 函数, qsort 和 sort 函数。直接调用即可排序,所以不少同学估计都没有自己写过快速排序的代码。而快排里面使用的分治思想很实用。

快排思路:1.选取一个元素 X作为某段数据的标识,让比 X 小的都排在左边,比 X 大的都排在右边。2.递归的进行第 1步,直到所有数据都排好序。

Page 21: 第五章 基础题目选解

堆排序堆排序需要维护的堆的性质要满足:1. 是一棵二叉树,而且是完全二叉树(除了最后一层都是满的,最后一层先把左边填满)2. 如果是最大堆,要保证父节点的值大于两个子节点的值。(最小堆同理)

二叉树的数据结构是用数组来表示的,完全二叉树的性质有 父节点坐标 *2 = 左儿子坐标,父节点坐标 *2 + 1 = 右儿子坐标。

流程:1.建立一个最大堆,让数组满足堆的性质。2.每次取出堆顶的最大值,放到堆尾,并将堆的大小减去 1 ,直到剩下一个元素不用排序为止。

Page 22: 第五章 基础题目选解

习题 8 : 字母重排 输入一个字典(用 ****** 结尾),然后再输入若干单词。每输入一个单词 w ,你都需要在字典中找出所有可以用 w 的字母重新排后得到的单词,并按照字母字典序从小到大的顺序在一行中输出(如果不存在,输出:()。输入单词之间用空格和空行隔开,且所有输入单词都由不超过 6 个小写字母组成。注意,字典中的单词不一定按字典序排列。

Page 23: 第五章 基础题目选解

qsort七种排序方法

Page 24: 第五章 基础题目选解

一、对 int类型数组排序int num[100];Sample:int cmp ( const void *a , const void *b ){return *(int *)a - *(int *)b;}qsort(num,100,sizeof(num[0]),cmp);

Page 25: 第五章 基础题目选解

二、对 char类型数组排序(同 int类型)char word[100];Sample:int cmp( const void *a , const void *b ){return *(char *)a - *(int *)b;}qsort(word,100,sizeof(word[0]),cmp);

Page 26: 第五章 基础题目选解

三、对 double类型数组排序(特别要注意)double in[100];int cmp( const void *a , const void *b ){return *(double *)a > *(double *)b ? 1 : -1;}qsort(in,100,sizeof(in[0]),cmp);

Page 27: 第五章 基础题目选解

四、对结构体一级排序struct In{ double data; int other;}s[100]//按照 data 的值从小到大将结构体排序 ,关于结构体内的排序关键数据 data 的类型可以很多种,参考上面的例子写int cmp( const void *a ,const void *b){return (*(In *)a)->data > (*(In *)b)->data ? 1 : -1;}qsort(s,100,sizeof(s[0]),cmp);

Page 28: 第五章 基础题目选解

五、对结构体二级排序struct In{ int x; int y;}s[100];//按照 x从小到大排序,当 x相等时按照 y从大到小排序int cmp( const void *a , const void *b ){struct In *c = (In *)a;struct In *d = (In *)b;if(c->x != d->x) return c->x - d->x;else return d->y - c->y;}qsort(s,100,sizeof(s[0]),cmp);

Page 29: 第五章 基础题目选解

六、对字符串进行排序struct In{ int data; char str[100];}s[100];//按照结构体中字符串 str 的字典顺序排序int cmp ( const void *a , const void *b ){return strcmp( (*(In *)a)->str , (*(In *)b)->str );}qsort(s,100,sizeof(s[0]),cmp);

Page 30: 第五章 基础题目选解

qsort 头文件为 #include <stdlib.h>sort 头文件为  #include <algorithm>sort 调用格式 sort(a,a+n,cmp);sort 更好用

Page 31: 第五章 基础题目选解

检索 常用的就是遍历和二分检索

Page 32: 第五章 基础题目选解

二分检索二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用 O(log n) 完成搜索任务。它的基本思想是,将 n 个元素分成个数大致相同的两半,取 a[n/2]与欲查找的 x作比较,如果x=a[n/2] 则找到 x ,算法终止。如果 x<a[n/2] ,则我们只要在数组 a 的左半部继续搜索 x (这里假设数组元素呈升序排列)。如果 x>a[n/2] ,则我们只要在数组 a 的右半部继续搜索 x 。

Page 33: 第五章 基础题目选解

5.4 数学基础

明天有队友讲这一节

Page 34: 第五章 基础题目选解

5.5 在线评测 BOJ POJ