题解8 统计单词数、笨小猴C 语言实现统计单词数1. 题目描述一般的文本编辑器都有查找单词的功能该功能可以快速定位特定单词在文章中的位置有的还能统计出特定单词在文章中出现的次数。现在请你编程实现这一功能具体要求是给定一个单词请你输出它在给定的文章中出现的次数和第一次出现的位置。注意匹配单词时不区分大小写但要求完全匹配即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同参见样例 1如果给定单词仅是文章中某一单词的一部分则不算匹配参见样例 2。输入格式共 2 行。第 1 行为一个字符串其中只含字母表示给定单词第 2 行为一个字符串其中只可能包含字母和空格表示给定的文章。输出格式一行如果在文章中找到给定单词则输出两个整数两个整数之间用一个空格隔开分别是单词在文章中出现的次数和第一次出现的位置即在文章中第一次出现时单词首字母在文章中的位置位置从 0 开始如果单词在文章中没有出现则直接输出一个整数 −1。注意空格占一个字母位。2. 代码实现#includestdio.h//统计单词数intmain(){//存放待查找的单词charword[20];//存放整篇文章charstr[1000020];//定义c用于逐个读取输入的字符charc;//wlen是待查单词的长度alen是文章的长度初始值都为0intwlen0,alen0;//输入第一行的第一个字符scanf(%c,c);//一直读到换行符为止即读完整个待查的单词while(c!\n){if(cAcZ){//如果是大写字母c32;//利用ASCII码表全部转成小写字母不区分大小写}//把字符存入word数组word[wlen]c;//单词长度1wlen;//继续读取下一个字符scanf(%c,c);}//读第二行文章每次读取一个字符读到换行符或文件结束就停止//这里的1代表scanf的返回值意为返回成功匹配并赋值输入项的个数while(scanf(%c,c)1c!\n){if(cAcZ){c32;}//把字符存入文章数组strstr[alen]c;//文章长度1alen;}//count用来记录单词出现的次数intcount0;//first用来标记第一次出现的位置-1表示还没找到intfirst-1;//i是扫描文章当前的下标inti0;//从头到尾扫描文章while(ialen){//如果当前是空格if(str[i] ){i;//跳过空格看下一个字符}else{//遇到文章的开头j从i开始向后找这个单词的结尾intji;//while循环控制只要没到文章的末尾且不是空格就继续往后走while(jalenstr[j]! ){j;}//先比较长度是否与待查单词的长度相同if(j-iwlen){//same标记两个单词是否完全相同先假设相同标记为1intsame1;//逐个字符比较for(intk0;kwlen;k){//只要在遍历过程中发现一个字母不同if(str[ik]!word[k]){//same标记为0不相同same0;}}//如果两个单词完全相同if(same1){//出现次数1count;//如果这是第一次找到if(first-1){//就记录它在文章中的位置firsti;}}}//跳到当前文章的末尾继续扫描后面的内容ij;}}//如果一次都没找到if(count0){//按题目要求打印-1printf(-1\n);}else{//否则输出出现次数和第一次出现的位置printf(%d %d\n,count,first);}return0;}3. 代码说明大小写处理读取时统一将大写字母转为小写实现不区分大小写的匹配。单词匹配按空格分割句子中的单词先比较长度再逐字符比较内容。位置记录first记录第一次匹配到的起始下标初始为-1表示未找到。4.运行结果展示笨小猴1. 题目描述笨小猴的词汇量很小所以每次做英语选择题的时候都很头疼。但是他找到了一种方法经试验证明用这种方法去选择选项的时候选对的几率非常大这种方法的具体描述如下假设 maxn 是单词中出现次数最多的字母的出现次数minn 是单词中出现次数最少的字母的出现次数如果 maxn−minn 是一个质数那么笨小猴就认为这是个 Lucky Word这样的单词很可能就是正确的答案。输入格式一个单词其中只可能出现小写字母并且长度小于 100。输出格式共两行第一行是一个字符串假设输入的单词是 Lucky Word那么输出 Lucky Word否则输出 No Answer第二行是一个整数如果输入的单词是 Lucky Word输出 maxn−minn 的值否则输出 0。2. 代码实现#includestdio.h//引入数学库用于sqrt开平方#includemath.h//洛谷 笨小猴//建立一个函数isPrime用来判断一个整数n是不是质数是返回1不是返回0intisPrime(intn){//小于2的数都不是质数if(n2)return0;//这里用到了试除法只需检查到根号nintlimit(int)sqrt(n);//从2开始逐个尝试是否整除nfor(inti2;ilimit;i){//如果i能整除n说明n有除1以外的因数if(n%i0)//不是质数返回0return0;}//所有的数都试过了不能整除说明是质数返回1return1;}//主函数intmain(){//word数组存放输入的单词charword[110];//读入一个字符串遇到空白停止scanf(%s,word);//count数组分别记录字母a~z出现的次数全部初始化为0intcount[26]{0};//从头遍历单词直到遍历到结束符\0for(inti0;word[i]!\0;i){//word[i] - a把字母映射为0~25的下标对应字母出现的次数count[word[i]-a];}//maxn记录出现次数最多的字母的次数初始值为0//minn记录出现次数最少的字母的次数初始化为1000intmaxn0;intminn1000;//遍历26个字母的计数for(inti0;i26;i){//只考虑在单词中出现过的字母if(count[i]0){//如果当前的字母出现的次数比已知的最大值还大if(count[i]maxn)//更新最大值maxncount[i];if(count[i]minn)minncount[i];}}//d是最大次数和最小次数的差值intdmaxn-minn;//如果d是质数if(isPrime(d)){//打印Lucky Wordprintf(Lucky Word\n%d\n,d);}else{//否则打印No Answerprintf(No Answer\n0\n);}return0;}3. 代码说明质数判断自定义isPrime函数用试除法判断差值是否为质数只需检查到根号n即可提高效率。字母计数用长度为 26 的数组统计每个字母出现的次数通过word[i] - a将字母映射为下标。最值计算遍历计数数组只考虑出现过的字母分别求出出现次数的最大值maxn和最小值minn。结果输出计算差值d maxn - minn若为质数则输出Lucky Word和差值否则输出No Answer和0。4.运行结果展示 SEO 优化官网定制响应式建站教育培训建站