C++中怎么实现一个大整数乘法
创作时间:
作者:
@小白创作中心
C++中怎么实现一个大整数乘法
引用
1
来源
1.
http://www.cdweb.net/article/jpcgee.html
在C++编程中,大整数乘法是一个常见的算法问题。由于标准整数类型无法处理非常大的数值,因此需要通过特殊的数据结构和算法来实现大整数的乘法运算。本文将详细介绍如何在C++中实现大整数乘法,包括算法原理和具体代码实现。
算法竞赛入门经典 这本书并没有对大数乘法实现,所以自己补充了一下,乘法的实现很简单,就是再其数据结构基础上把每宽为8位的十进制数看成多项式的系数,vector的下标看成多项式的指数,然后再对应相乘相加就可以了,注意系数超过8位 将超八位的补分进位。
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
typedef long long LL;
struct BigInteger{
static const int BASE = 100000000;
static const int WIDTH = 8;
vector<int> s;
BigInteger operator = (const string& str){
s.clear();
int x, len=(str.length()-1)/WIDTH+1;
for(int i=0;i<len;i++){
x=0;
for(int j=max(0,str.length()-(i+1)*WIDTH);j<min((int)str.length(),i*WIDTH+WIDTH);j++)
x=x*10+str[j]-'0';
s.push_back(x);
}
return *this;
}
BigInteger operator * (const BigInteger& b) const{
int lena=s.size(),lenb=b.s.size(),lenc=lena+lenb-1;
LL *buf =new LL[lenc+1];
for(int i=0;i<=lenc;i++) buf[i]=0;
for(int i=0;i<lena;i++)
for(int j=0;j<lenb;j++)
buf[i+j]+=((LL)s[i])*((LL)b.s[j]);
for(int i=0;i<lenc;i++){
buf[i+1]+=buf[i]/BASE;
buf[i]=buf[i]%BASE;
}
BigInteger c;
c.s.resize(lenc);
for(int i=0;i<lenc;i++)
c.s[i]=buf[i];
delete[] buf;
return c;
}
void print(){
printf("%d",s.back());
for(int i=s.size()-2;i>=0;i--){
int buf=s[i],h=8;
while(buf>0){buf/=10;h--;}
for(int j=0;j<h;j++) printf("0");
printf("%d",s[i]);
}
printf("\n");
}
};
int main(){
string a,b;
cin>>a>>b;
BigInteger x,y;
x=a;y=b;
(x*y).print();
return 0;
}
关于C++中怎么实现一个大整数乘法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
热门推荐
心理咨询师能从存在主义中学到什么
慕田峪长城一日游攻略
碳酸水与减肥真相:最新研究揭示其效果与局限
绝地求生PUBG fps提升方法汇总-优化游戏性能解析
深度解析口袋妖怪绿宝石:游戏攻略与技巧大全
贲门癌越来越高发,你却听都没听过?是时候了解一下
榆叶梅的生态习性
《炉石传说》狂野战吼萨卡组构筑与实战心得分享
桃花的象征与寓意——花开人间,美好无限(从桃花寓意到文化象征)
紫微斗数命理八字与现代科学是否存在冲突
心率偏高是什么原因
中国1614名开国将帅的分省域空间可视化分析
罗建云:跨越千年 北宋皇陵留给我们永久的谜
鼻中隔偏曲手术风险多大
28岁抗癌博主"小何日记"去世,她的故事撕开健康危机的冰山一角
简单点!摄影中M档、 A档、Tv档、B档、p档,3分钟搞懂相机档位。
系统架构设计模式全解析:从基础概念到实战应用
临床研究:rb-bFGF凝胶治疗中度干眼的效果观察
睡得少,血压高
全球军力排行榜荒诞出炉,俄超美、中第四、乌克兰排在德国前?
"弗"字怎么读? - 解开汉字奥秘,揭开“弗”字背后的故事!
“咳咳咳”不停,咳嗽总不好?权威用药方案来了!
3月日照赶海攻略:黄金时段、工具清单与5大赶海点推荐
诗词情深 传承文化,用十首诗词纪念叶嘉莹先生
伤口上撒盐能消毒吗?三甲医院教您如何正确处理烧/烫伤
「改革创新」田轩:我国转融券实践的监管启示
“大数据杀熟”愈演愈烈 去哪儿、携程等OTA平台成被投诉“重灾区”
春运抢票,为何选择12306才是“最优解”
肝癌靶向药全解析:索拉非尼、瑞戈非尼、多纳非尼、仑伐替尼的区别
解决重装系统引导失败问题:五大步骤详解与实用技巧