算法设计与分析实验1:利用减治法和分治法来处理同一个问题

这篇博客介绍了如何利用减治法和分治法来处理大整数乘法问题。实验详细阐述了俄式乘法(俄国农夫法)的算法实现,其时间复杂度为O(log(底数为2)n),空间复杂度为S(1)。此外,还探讨了大整数乘法的分治思想,通过拆分和优化计算步骤,将时间复杂度优化为O(n1.59)。实验中包含了两种方法的代码实现和运算结果对比。
摘要由CSDN通过智能技术生成

目录

实验1  利用减治法和分治法来处理同一个问题

一、实验目的

二、实验内容和要求

【俄式乘法函数原型及功能说明】

【核心函数实现代码及时间复杂度与空间复杂度分析】

(1)俄式乘法实现代码

(2)时间复杂度:O(log(底数为2)n)

(3)空间复杂度:无递归算法,为S(1)

【大整数乘法函数原型及功能说明】

(1)大整数乘法分治思想实现代码

(2)时间复杂度分析:上式一共需要进行2次xn0的乘法(AC、AD各一次)、2次yn0的乘法(AC、BC各一次)和3次加法,因而该算法的时间复杂度为

【拓展完善代码】

【程序运算结果截图】 

(1)利用减治法和分治法来处理同一个问题结果

三、实验总结


实验1  利用减治法和分治法来处理同一个问题

一、实验目的

1. 掌握减治法和分治法的思想,熟练掌握顺序表基本算法的实现。

2. 掌握利用利用减治法和分治法解决同一问题的思路。

3. 分析核心代码的时间复杂度和空间复杂度。

二、实验内容和要求

编写一个程序实现任意大整数(没有上限)之间的四则运算,并必须使用第四章的俄式乘法和第五章的大整数乘法来完成。

【俄式乘法函数原型及功能说明】

俄式乘法,又被称为俄国农夫法,是我们考虑对两个数相乘的非主流算法,假设n和m是两个正整数,我们要计算它们的乘积,同时我们用n的值作为实例规模度量标准。如果n是偶数,则n x m=n/2 x 2m,如果n是奇数,则需对公式做轻微的调整:

n x m= (n-1)/2 x 2m +m。 并且以1 x m=m作为算法结束条件。在n等于奇数时依次加上m的结果一直到m等于1时,最后的值即为最开始相乘的值

【核心函数实现代码及时间复杂度与空间复杂度分析】

(1)俄式乘法实现代码

int Russia(int n, int m)
{
	int sum = 0,a=0;
	while (n != 1){
		//n为偶数
		if (n % 2 == 0)
		{
			n = n / 2;
			m *= 2;  
            printf("%d %d\n", n, m);
		}
		//n为奇数
        else{
			n = (n - 1) / 2;
			a += m;
			m = m * 2;
			printf("%d %d\n", n, m);
		}
	}
	sum=m + a; 
	return sum;
}

(2)时间复杂度:O(log(底数为2)n)

(3)空间复杂度:无递归算法,为S(1)

完整代码

#include "stdio.h"

int Russia(int n, int m)
{
 int sum = 0,a=0;
 
 while (n != 1){
  if (n % 2 == 0)//n为偶数
  {
   n = n / 2;
   m *= 2;  
   printf("%d %d\n", n, m);
  }
  else{//n为奇数
   n = (n - 1) / 2;
   a += m;
   m = m * 2;
   printf("%d %d\n", n, m);
  
  }
 }
 sum=m + a; 
 return sum;
}
int main()
{
 int n, m,mul;
 printf("请输入要相乘的两个数:");
 scanf("%d%d", &n, &m);
 mul=Russia(n, m);
 printf("最后结果为:%d\n", mul);

}

【大整数乘法函数原型及功能说明】

  • 两个大整数在理想状态下:就是两个大整数的位数相同

现在有两个大整数X,Y;   

设X, Y是n位十进制整数,即 X=A*10^(n/2)+B,   Y=C*10^(n/2)+D  则:

本来可以直接算AD+BC,但是这样效率变低了,所以对AD+BC进行分解优化后得:

  • 两个大整数在非理想状态下:就是两个大整数的位数不相同

我们还是假设有两个大整数X、Y,它们的位数不相同,现在要求X*Y的乘法,我们采用分治的算法,将X、Y分别拆分为A与B、C与D,

【核心函数实现代码及时间复杂度与空间复杂度分析】

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值