【教学课件】第五章基础题目选解.ppt
第五章第五章 基础题目选解基础题目选解09计算机黎明明学习目标:1、学会用常量表简化代码2、学会用状态变量辅助字符串读入3、学会用结构体定义高精度整数,并设计构造函数、复制构造函数和输入输出办法。4、学会为结构体定义“小于”运算符,并用它定义其他比较运算符5、掌握冒泡排序和顺序检索6、熟练掌握用qsort库函数给整数和字符串排序的方法。7、熟练掌握小规模素数表的构造方法8、熟练掌握素因子分解的办法。9、熟练掌握三角形有向面积的意义和计算办法10、完成一定数目的习题。学习目标:在算法比赛中,编程能力非常重要。算法设计得再好,如果不能在很短的时间里面实现出来也是白搭。这一章就是通过一些习题,让大家对一些小的编程技巧有所了解。为后面一些复杂的算法打基础。5.1字符串纯字符串的容易题大多数都是一看就知道怎么做,虽然思路简单但是实现却比较繁琐,如果不用一些小技巧来简化,那么代码量就会很大,而且很容易出小错误。习题1:输入一个错位后敲出的字符串,输出打字员本来想打出的句子。如何做到题目要求的输入一个字符串?主要输入库函数:一次输入一个字符:scanf(,);getchar()getch一次输入一个字符数组:scanf(,);gets()C+cin1、更广义的常量2、转义3、多种解法,代码长度不一样4、可以尝试C+里面的string习题2:TeX括号在Tex中,左括号是,右括号是。输入一篇包含双引号的文章,你的任务是把它转化为TeX格式习题3:周期串如果一个字符串可以由某个长度为K的字符串重复多次得到,我们就说该串以K为周期。例如,abcabcabcabc以3位周期(注意,它也是以6和12为周期)。输入一个长度不超过80的穿,输入它的最小周期。样例输入:HoHoHo样例输入:25.2高精度在介绍C语言时,大家已经看到很多整数溢出的情形。如果计算的结果真的很大,需要用所谓的高精度算法,用数组来存储整型,模拟手算的方法进行四则计算。习题4:小学生算术很多学生在学习加法时,发现“进位”特别容易出错。你的任务是计算两个整数的相加时需要多少次进位。你编制的程序应当可以处理连续多组数据,直到读到两个0(这是输入标记结束)。假设输入的整数都不超过9个数字。习题5阶乘的精确值输入不超过1000的正整数n,输n!=1*2*3n的精确解。习题6:实现高精度类5.3排序与检索数据处理室计算机的强项,包括排序,检索统计等。这里举一些经典的例子。习题7:6174问题假设你有一个各位数字互不相同的四位数,把所有数字从大到小排列后得到a,从小到大排序后得到b,然后用a-b替换原来的数,并且继续操作,直到回到自己。冒泡排序思想:设想被排序的数组R1.N垂直竖立,将每个数据元素看作有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上漂浮,如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。主要的排序办法:冒泡排序快速排序堆排序合并排序插入排序桶排序基数排序希尔排序快速排序快速排序是竞赛中经常需要使用的算法,特别是高中的信息学比赛,可以说快速排序算法是必须非常熟悉的。而ACM中可以使用C,C+函数,qsort和sort函数。直接调用即可排序,所以不少同学估计都没有自己写过快速排序的代码。而快排里面使用的分治思想很实用。快排思路:1.选取一个元素X作为某段数据的标识,让比X小的都排在左边,比X大的都排在右边。2.递归的进行第1步,直到所有数据都排好序。堆排序堆排序需要维护的堆的性质要满足:1.是一棵二叉树,而且是完全二叉树(除了最后一层都是满的,最后一层先把左边填满)2.如果是最大堆,要保证父节点的值大于两个子节点的值。(最小堆同理)二叉树的数据结构是用数组来表示的,完全二叉树的性质有父节点坐标*2=左儿子坐标,父节点坐标*2+1=右儿子坐标。流程:1.建立一个最大堆,让数组满足堆的性质。2.每次取出堆顶的最大值,放到堆尾,并将堆的大小减去1,直到剩下一个元素不用排序为止。习题8:字母重排输入一个字典(用*结尾),然后再输入若干单词。每输入一个单词w,你都需要在字典中找出所有可以用w的字母重新排后得到的单词,并按照字母字典序从小到大的顺序在一行中输出(如果不存在,输出:()。输入单词之间用空格和空行隔开,且所有输入单词都由不超过6个小写字母组成。注意,字典中的单词不一定按字典序排列。qsort七种排序方法一、对int类型数组排序intnum100;Sample:intcmp(constvoid*a,constvoid*b)return*(int*)a-*(int*)b;qsort(num,100,sizeof(num0),cmp);二、对char类型数组排序(同int类型)charword100;Sample:intcmp(constvoid*a,constvoid*b)return*(char*)a-*(int*)b;qsort(word,100,sizeof(word0),cmp);三、对double类型数组排序(特别要注意)doublein100;intcmp(constvoid*a,constvoid*b)return*(double*)a*(double*)b?1:-1;qsort(in,100,sizeof(in0),cmp);四、对结构体一级排序structIndoubledata;intother;s100/按照data的值从小到大将结构体排序,关于结构体内的排序关键数据data的类型可以很多种,参考上面的例子写intcmp(constvoid*a,constvoid*b)return(*(In*)a)-data(*(In*)b)-data?1:-1;qsort(s,100,sizeof(s0),cmp);五、对结构体二级排序structInintx;inty;s100;/按照x从小到大排序,当x相等时按照y从大到小排序intcmp(constvoid*a,constvoid*b)structIn*c=(In*)a;structIn*d=(In*)b;if(c-x!=d-x)returnc-x-d-x;elsereturnd-y-c-y;qsort(s,100,sizeof(s0),cmp);六、对字符串进行排序structInintdata;charstr100;s100;/按照结构体中字符串str的字典顺序排序intcmp(constvoid*a,constvoid*b)returnstrcmp(*(In*)a)-str,(*(In*)b)-str);qsort(s,100,sizeof(s0),cmp);qsort头文件为#includesort头文件为#includesort调用格式sort(a,a+n,cmp);sort更好用检索常用的就是遍历和二分检索二分检索二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(logn)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取an/2与欲查找的x作比较,如果x=an/2则找到x,算法终止。如果xan/2,则我们只要在数组a的右半部继续搜索x。5.4数学基础明天有队友讲这一节5.5在线评测BOJPOJ