大整数乘法的karatsuba算法

实验报告

   _(系) 班级    学号    姓名   

实验日期 _  __                                指导老师    

实验名称  大整数乘法的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这两个算式的计算结果。

编写程序的时候要调用一下天花板函数和地板函数。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaojiwazi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值