#include <iostream>
#include <sstream>//这里的头文件是sstream,不是stringstream,应该是缩写吧。
#include <cstring>
using namespace std;
stringstream os;
//C++实现大数乘法,加法比乘法写起来要简单些,其实也不是很复杂
//菜鸡瑟瑟发抖
int a[100];
int b[100];
int c[100];
string x;
string y;
string mul(string x,string y)
{
os.clear();
string z;
memset(a,0,sizeof(a));//初始化
memset(b,0,sizeof(b));//初始化
memset(c,0,sizeof(c));//初始化
for(int i=x.length()-1;i>=0;--i)
{
a[x.length()-i]=int(x[i]-'0');
}//将输入的字符串倒序存在整形数组里
//注意啊,这个地方与大数加法写法有点不同的
//对于大数加法来说,从第0位来算和从第1位来算(此时c[0]不用来存储数位)
//是没有区别的,因为加法就是逐位计算的,不影响,相对写起来就简单一些
/*
但是对于乘法来说就不一样了,主要的公式是c[i+j-1]+=a[i]*b[j],按十进制写开就可以得到该公式
123=1*10^2+2*10^1+3*10^0;
此时i,j必须从1开始数,才比较好写程序,否则的i从0开始,j从0开始,会得到c[-1],比较尬
*/
for(int j=y.length()-1;j>=0;--j)
{
b[y.length()-j]=int(y[j]-'0');
}// 将输入的字符串倒序存在整形数组里
int len1=x.length();
int len2=y.length();
int sum=0;
int len=max(len1,len2);
for(int i=1;i<=len;++i)
{
for(int j=1;j<=len;++j)
{
c[i+j-1]+=a[i]*b[j];//和大数加法一样,先算各位的数值,最后统一进位
}
}
for(int i=1;i<=2*len+2;++i)//把位数稍微取大一点就可以了。
{
c[i]+=sum;
sum=c[i]/10;
c[i]%=10;
}
int index;
for(int i=2*len+2;i>=1;i--)//输出时,是从第一个不为0的开始输出
{
if(c[i]!=0)
{
index=i;
break;//我去咧
}
}
for(int i=index;i>=1;i--)
{
os<<c[i];
}
os>>z;
return z;
}
int main(void)
{
while(cin>>x>>y)
{
cout <<mul(x,y)<<endl;
}
return 0;
}
C++-大数乘法模拟
最新推荐文章于 2024-03-01 20:44:20 发布