目录
题目内容
1、 完成百元买百鸡
2、串匹配问题
3、完成求差
4、分数化简
题目分析
1.百元买百鸡:
目的:求满足公鸡*5+母鸡*3+小鸡/3=100元且公鸡+母鸡+小鸡=100的三种鸡的数目并输出。
思路:(暴力法)三层循环,由于公鸡最多买20只母鸡最多买33只,所以三层循环中公鸡、母鸡分别循环到20和33即可,寻找在范围中符合条件的三种鸡的数目并输出。流程图如下:
2.串匹配:
目的:求主串中子串所在的位置。
思路:从主串S的第index(index起始设置为0)个字符开始,和模式串T的第一个字符进行比较,若相等,则继续比较后续字符;否则回溯到主串S的第index+1个字符开始重新和模式串T进行比较。以此类推,直至模式串T中的每一个字符依次和主串S中的一个连续的字符序列相等,则称模式匹配成功,此时返回模式串T的第一个字符在主串S中的位置;否则主串中没有和模式串相等的字符序列,称模式匹配不成功。
3.求差:
目的:求一维数组:a[0]-a[1]-a[2]-…-a[n];的值
思路:先定义一个存储结果的变量minR,初始化minR=0,因为求差计算只有第一个数是正数,所以先把a[0]赋值给minR,在利用循环遍历i=1到n的数组执行minR=minR-a[i]即可。
4.分数化简:
目的:把一个分数化为最简分数。
思路:找出分子分母中较小的数temp,循环从temp到2寻找分子分母的公约数,并将分子分母分别除以公约数,循环结束后分数即化为最简分数。
问题解决
1.百元买百鸡
算法描述:
算法:求百元买百鸡的情况Chiken()
输入:无
输出:满足条件的三种鸡的数量;
过程:1.定义循环变量i,j,k
2.初始化循环变量i=0循环变量i从0到20循环执行以下:
2.1.初始化循环变量j=0循环变量j从0到33循环执行以下:
2.1.1.初始化循环变量k=0循环变量k从0到100(每次自增3)循环执行以下:
如果5*i+3*j+k/3==100&&i+j+k==100
输出i,j,k对应的数量。
算法实现:
运行结果:
时间复杂度:三层循环时间复杂度为O(n^3);
优化:在计算第三种鸡时可以用100-x-y计算,这样可以减少一层循环。
2.串匹配:
算法描述:
算法:求子串在主串中的位置getStrand()
输入:主串S,子串T
输出:子串T第一个字符在主串S中的位置
过程:1.定义数组标注位index,主串下标变量i,子串下标变量j,并初始化为0
2.无限循环直到主串遍历结束或者子串遍历结束执行以下:
2.1如果字符相等则下标i,j自增1;
2.2如果不相等把标志位index++,并赋给i,j赋值为0
3.循环结束如果子串遍历完renturn index+1
4.否则return 0
算法实现:
运行结果:
时间复杂度:最坏情况为循环(m*n)次,最好情况为循环(n)次->时间复杂度为:O(m*n)
3.求差:
算法描述:
算法:求一维数组差:getMinus
输入:长度为n的数组a[]
输出:数组差minR
过程:1.定义变量minR储存差值并初始化为0
2.将a[0]赋值给minR
3.定义循环变量i=1,循环变量i从1到n-1循环执行以下:
minR=minR-a[i]
4.输出差值minR
算法实现:
运行结果:
时间复杂度:循环了n-1次,->O(n)
4.分数化简:
算法描述:
算法:化简分数getsimple()
输入:分数的分子a和分母b
输出:化简后的分子a和分母b
过程:1.比较分子和分母大小,将将小数赋值给a把大数赋值给b
2.设置标志位lable判断a b的值是否有换位置
3.定义变量temp储存较小值
4.定义循环变量i,循环变量i从temp到2执行以下:
4.1若a%i==0&b%i==0
4.1.1 a=a/i;b=b/i;
5.判断lable,输出a,b值
算法实现:
运行结果:
时间复杂度:循环了temp次->O(n)
总结
蛮力思路清晰简单,便于读者理解,便于实现,把一个问题实现的所有情况都列举出来,选择符合条件的情况,类似于数学中的穷举法。缺点是:代码运行的时间较长,时间复杂度较高,代码效率较低,适合规模较小的问题。对于百元买百鸡:在计算第三种鸡时可以用100-x-y计算,这样可以减少一层循环。