算法实验报告一
分治法实验
一、实验目的及要求
利用分治方法设计大整数乘法的递归算法,掌握分治法的基本思想和算法设计的基本步骤。
要求:设计十进制的大整数乘法,必须利用分治的思想编写算法,利用c语言(c++语言)实现算法,给出程序的正确运行结果。(必须完成)
设计二进制的大整数乘法,要求利用分治的思想编写递归算法,并可以实现多位数的乘法(利用数组实现),给出程序的正确运行结果。(任选)
二、算法描述
1.十进制大整数乘法的算法描述:
利用分治递归的思想,在计算机能处理的数的范围内,假设n是二的整数次幂。设两个n位数u
与v相乘,把要相乘的两个整数分成两部分,每部分为n/2位,则原来的u=w*2n/2+x,v=y*2n/2+z,则u
与v的乘积可以计算为:
uv= (w*2n/2+x)(
y*2n/2+z)=wy2n+(wz+xy)2n/2+xz。在这个公式中,应用分治的思想,递归函数中递归四次,一次为w、y的递归调用,将其结果左积n位,一次w、z的递归调用,一次x、y的递归调用,这两次递归调用结果左移n/2位,还有一次x、z的递归调用。最后将其四次递归结果相加,即得u
与v的乘积。其中左移通过pow()函数实现。
2.二进制大整数乘法的数组表示:
与十进制大整数乘法相同的是用数组实现时也用到了分治递归的思想。但是它没有用到乘除运算,而是利用数组相加赋值、倒置等操作完成移位。从而完成数组实现的二制乘法。这个算法的关键在于如何存储二进制数,然后如何实现相乘,即用加法代替乘法,通过二进制相乘特有的性质,中间用到了很多辅助数组。
还有就是递归调用的函数的返回值是指针类型。
三、调试过程及运行结果
详细记录程序在调试过程中出现的问题及解决方法,记录程序执行的结果。
调试中出现的问题:一开始并不是任意两个四位数相乘都可以得到正确结果,原因是我把待相乘的两个数定义为整型,递归函数的返回类型也定义为int,发现结果不对。后来通过将其定义为长整型,递归函数的返回类型也定义为long型才能够完成在计算机允许的数据范围内完成两个大整数的相乘。
调试过程中出现的问题:输出结果不对,一开始每位对应相乘的结果与正确相乘的结果反了。后来经过检查发现是分的时候有问题,因为一开始我还是按十进制的思想高位为W,低位为X,同理另一个数也是高位为Y,低位为Z,然后相乘
由于是数组先输进的是低位,故乘得每位在单步调试时发现不对,刚好反了,反来将其修正,把高位分给X,低位分给W,即正确。后来接着出现了好多问题。
通过单步调试,终于结果正确了。
四、实验总结
通过本次实验使我进一步理解了分治递归的思想,因为一开始我总是走进一个死胡