当前位置: 首页 > 科技观察

大整数乘法和分治算法_0

时间:2023-03-15 15:58:38 科技观察

数据加密处理中有很多复杂的加密算法,这些加密算法往往会用到很多超大整数运算。但是,编程语言对数据的大小有一定的限制。如果数据太大,会出现数据溢出,不能用于大整数数据的运算。本文将和你一起学习如何实现对大整数的数据运算。我们使用C++来实现本文中的代码。普通乘法运算乘法运算有一个比较简单易懂的方法。我们可以用小学时学过的列-竖式计算法来进行乘法运算。列-垂直相乘指的是上图中列-垂直的计算方式,我们实现代码。#include#include#include#include#include#includestd::stringmultiply(std::stringa,std::stringb){std::stringresult="";introw=b.size();intcol=a.size()+1;inttmp[row][col];memset(tmp,0,sizeof(int)*row*col);reverse(a.begin(),a.end());reverse(b.begin(),b.end());for(inti=0;i=0){if(i=0;i--){if(sum[i]==0&&zeroStartFlag){继续;}zeroStartFlag=false;result.append(std::to_string(sum[i]));}returnresult;}intmain(){std::stringa="3456";std::stringb="1234";std::stringresult=multiply(a,b);std::cout<#include#include#include#include#include#includestd::stringadd(std::stringa,std::stringb){intN=std::max(a.size(),b.size());intsum[N];memset(sum,0,sizeof(int)*N);reverse(a.begin(),a.end());reverse(b.begin(),b.end());for(inti=0;i9){sum[i+1]=sum[i]/10;sum[i]%=10;}}std::stringresult="";boolzeroStartFlag=true;for(inti=N-1;i>=0;i--){if(sum[i]==0&&zeroStartFlag){继续;}zeroStartFlag=false;result.append(std::to_string(sum[i]));}returnresult;}std::stringdivideAndConquer(std::stringa,std::stringb){if(a.size()<2&&b.size()<2){returnstd::to_string(std::stoi(a)*std::stoi(b));}intn=a.size();intm=b.size();inthalfN=n/2;inthalfM=m/2;std::stringa0="0";std::stringa1="0";if(a.size()>halfN&&halfN>0){a1=a.substr(0,halfN);a0=a.substr(halfN,a.size()-halfN);}else{a1="0";a0=a;}std::stringb0="0";std::stringb1="0";if(b.size()>halfM&&halfM>0){b1=b.substr(0,halfM);b0=b.substr(halfM,b.size()-halfM);}else{b1="0";b0=b;}std::stringa1b1=divideAndConquer(a1,b1);std::stringa0b0=divideAndConquer(a0,b0);std::stringa1b0=divideAndConquer(a1,b0);std::stringa0b1=divideAndConquer(a0,b1);a1b1.append((n-halfN)+(m-halfM),'0');a1b0.append(n-halfN,'0');a0b1.append(m-halfM,'0');std::stringresult="";result=add(a1b1,a1b0);result=add(result,a0b1);result=add(result,a0b0);returnresult;}intmain(){std::stringa="3456";std::stringb="1234";std::cout<