一、实验目的
1 掌握蛮力法的设计思想(利用计算机去穷举所有的可能解,再从中依次找出可行解)
2 掌握蛮力法的具体实现和时间复杂度分析
3 理解蛮力法的常见特性
实验要求:先用伪代码描述利用蛮力法解决的算法解决方案,再用程序实现,计算时间复杂度,记录最终测试数据和测试结果
二、实验内容
(1)简短明确地写出实验的内容
-
(简单)实验内容1:计算一个整数数组中所有元素的差值。如a[0]-a[1]-...-a[n-1]。具体地,实验通过实现一个 substraction 方法来计算数组中元素的逐步相减,最后输出计算结果。
-
(中等)实验内容2:来计算两个整数的最大公约数(GCD),并将这两个整数化简为最简分数。程序包括输入验证,确保用户输入有效整数,并使用欧几里得算法提高计算效率。最后,输出化简后的结果。
三、问题分析
(1) 分析要解决的问题,给出你的思路,可以借助图表等辅助表达。
-
实验内容一
思路分析:
输入:我们有一个整数数组 a,长度为 n,即 a = [a[0], a[1], a[2], ..., a[n-1]]
计算过程:
从数组的第一个元素 a[0] 开始,逐个从数组中每个元素中减去后续的元素。
可以通过一个简单的迭代来实现,从 a[0] 开始,接着依次减去 a[1], a[2], ..., a[n-1]。
输出:输出最终的计算结果。
-
实验内容二
1.最大公约数计算:如何高效地计算两个整数的最大公约数。
利用循环和取余操作,可以高效地计算最大公约数。这种方法相较于简单遍历更高效。
2.分数化简:如何利用最大公约数将两个整数化简为最简分数。
通过将两个整数分别除以它们的最大公约数,得到最简形式的分数。
3.用户输入处理:如何确保用户输入的是有效的整数,并处理可能的错误输入。
使用 Scanner 读取用户输入,确保输入为整数。如果输入无效,提示用户重新输入。
(2)其它(你认为需要在此说明的)
边界条件: 程序需考虑特殊情况,例如输入为零或负数的情况。可以设置条件使得输入必须为正整数。
四、问题解决
(1)根据对问题的分析,写出解决办法。
-
实验内容一
我们可以通过一个循环来遍历数组,初始值为第一个元素,然后不断地从当前值中减去下一个元素。具体步骤如下:
初始化 result 为数组的第一个元素 a[0]。
从数组的第二个元素开始,依次减去每个元素,直到最后一个元素。
输出最终的 result。
-
实验内容二
1.用户输入:提示用户输入两个整数,并对输入进行有效性检查。
2.计算最大公约数(GCD):使用欧几里得算法来高效计算最大公约数。
3.化简分数:用最大公约数化简输入的两个整数,输出最简分数形式。
4.错误处理和提示:如果用户输入无效(如非整数、负数等),给予明确提示并要求重新输入。
(2)描述你在进行实现时,主要的函数或操作内部的主要算法;分析这个算法的时间复杂度,并说明你设计的巧妙之处,如有创新,将其清晰的表述。
实验内容一
1.主要函数:
2.时间复杂度:
遍历数组:我们需要遍历整个数组 a 一次,计算每个元素的差值。具体来说,遍历从数组的第一个元素到最后一个元素,执行减法操作。
每次操作的时间:每一次从 result 中减去一个元素,所需的时间是常数时间 O(1),因为减法操作是常数时间操作。
总时间复杂度:因为遍历数组需要执行 n-1 次减法,其中 n 是数组的长度,因此总的时间复杂度是 O(n),其中 n 为数组的长度。
3.运行结果
实验内容二
主要函数:
1.选择最小值:首先使用三元运算符确定 m 和 n 中的较小值,赋值给 min。
2.循环查找:从 min 开始向下逐一检查每一个整数 i,判断 i 是否同时为 m 和 n 的因子(即 m % i == 0 且 n % i == 0)。
3.返回结果:一旦找到这样的 i,就立即返回它作为最大公约数。如果循环结束仍未找到,则返回1(表示 m 和 n 互质)。
在最坏情况下,当 m 和 n 是互质的(如 8 和 9),函数会遍历到 min 的值,即 O(min(m, n)) 次。
因此,时间复杂度为 O(min(m, n))。
(3)运行结果截图以及其它(你认为需要在此说明的)
五、实验结果总结
回答以下问题:
(1)通过实验叙述你对蛮力法的理解及其优缺点
蛮力法是一种直接且简单的解决问题的方法,通常通过枚举所有可能的选项来寻找解决方案。在计算最大公约数时,蛮力法会逐一检查直至找到最大的共同因子。
优点:
简单易懂:实现代码较为简单,适合初学者理解。
可靠性:在小范围内能够保证找到正确答案。
缺点:
效率低:对于大数或复杂问题,时间复杂度较高,导致运行时间长。
资源消耗:可能需要较多的存储和计算资源,尤其在数据量大时。
(2)请列出对你实验中算法的改进之处。
1.使用欧几里得算法:改用欧几里得算法计算 GCD,可以将时间复杂度降低到 O(log(min(m, n))),提高效率。
2.提前终止:在循环中,可以引入条件,例如如果 i 的平方大于 m 或 n,则可以提前结束查找。
3.缓存计算结果:对于频繁计算相同数对的情况,可以缓存已计算的 GCD 值,避免重复计算。
(3)列出你在本次实验中遇到的各种问题
1.输入验证:在实验过程中,遇到了如何处理无效输入(如负数或零)的问题。
2.逻辑错误:在初始实现中可能出现边界条件处理不当的情况,比如输入相同数字时未能正确返回该数字作为 GCD。