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++中怎么实现一个大整数乘法就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。
热门推荐
二手房购买攻略:从房主面谈到费用准备
孕中期胎动变化:监测与健康指南
《仁王》好友联机攻略:加速器使用与联机方法详解
彩铅与素描:关联与差异解析
后山:涣卦-凝聚力量、把握机遇,实现更好发展
胃胀气别忍着,多半被5种疾病找上了,3招给肠胃“消消气”
如何判断手表大小是否合适?教您如何挑选手表尺寸
计算机逻辑运算法则:与、或、非的基本应用
现代朗动油耗高吗?真实车主是这样说的
印生比劫是什么意思
南通春季赏花全攻略:从梅花到牡丹,多个赏花地点推荐
腌大蒜怎么腌制好吃又脆
经典作品解读指南:从历史背景到当代意义
“再经典化”之外,“跨经典化”如何为经典文本打开新格局
常住人口4400余人的小区,如何全面开展实有人口登记工作?
掌握数控钻孔:刀具及其选择指南
永远相爱相吸引的星座配对 互相离不开的星座组合
汽车行业加速拥抱“智能化赛道” 我国车路城融合试点取得明显成效
1000家上市公司业绩快报:中证500表现最佳,医药生物领跑
泰克示波器在低温环境下的应用
拿破仑的辉煌与遗产
探究融资融券余额波动:助力投资者把握市场趋势
IGBT模块主要材料一览(实物图)
如何通过季K线图分析股票?
看腿就知道?闽南人教你如何分清章鱼、墨鱼和鱿鱼!
牛津布和无纺布哪个好?两者区别全解析
越来越多的加州学校禁止学生使用智能手机
如何选择适合自己的第一辆车?
璧山儿菜:重庆特产中的“绿色宝塔”
5个幽默风趣且富有哲理的小故事