实验报告
_(系) 班级 学号 姓名
实验日期 _ _年_ 月 日 指导老师
实验名称 大整数乘法的karatsuba算法
实验目的 大整数乘法的karatsuba算法
实验步骤(实验内容、写出代码和运行结果)
内容:
Karatsuba算法主要应用于两个大数的相乘,原理是将大数分成两段后变成较小的数位,如n位数x,y设x=10^n/2 * a + b; y=10^n/2 * c + d;
则根据Karatsuba算法可以得到
x*y=10^n *a*c+10^n/2 *((a+b)*(c+d)-a*c-b*d)+b*d;
根据上式可以减少算法复杂度,实现算法的优化。
要求:
用Karatsuba算法编写程序解决两个大数相乘的问题。
代码:
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int getn(long long n)
{
int t=0;
while(n>0)
{
n=n/10;
t++;
}
return t;
}
long karatsuba(long long x,long long y)
{
if(x<10&&y<10) return x*y;
int n=max(getn(x),getn(y));
int n2=ceil(n/2);
long long p=pow(10,n2);
long long a=floor(x/p);
long long b=x%p;
long long c=floor(y/p);
long long d=y%p;
// cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<p<<" "<<endl;
long long ac=karatsuba(a,c);
long long bd=karatsuba(b,d);
long long e=karatsuba(a+b,c+d)-ac-bd;
return (long long)(pow(10,2*n2)*ac+pow(10,n2)*e+bd);
}
int main()
{
long long a,b;
cout<<"请输入两个相乘的数据(整数)"<<endl;
cin>>a>>b;
cout<<"相乘结果为"<<endl;
cout<<karatsuba(a,b);
}
运行结果:
实验总结体会(主要书写:上机过程碰到的问题,自己如何解决的,还有哪些疑问,对本次上机进行认真总结,自己的体会)
原大整数乘法分治需要进行四次乘法,其时间复杂度为O(n^2
)。而karatsuba算法,变形后的式子中只需要三次乘法,其时间复杂度为,算法的时间复杂度得到了降低。其精髓就是重复利用了a*c和b*d这两个算式的计算结果。
编写程序的时候要调用一下天花板函数和地板函数。