高精度加法乘法
高精度加法&乘法都是把数字转化成数组进行运算,存储
高精度加法
建议多在纸上画画,梳理思路
代码实现
- 输入字符串
//初始化数组存储
int a[250]={0};
int b[250]={0};
int c[251]={0};
//定义字符串,输入字符串
string s1,s2;
getline(cin,s1);
getline(cin,s2);
-
字符串转逆序数组
int x=s1.size();
int y=s2.size();
int n=0;
int m=0;
for(int i=x-1;i>=0;i--)//x-1,避免数组越界
{
a[n]=s1[i]-'0';//字符转数字
n++;
}
for(int i=y-1;i>=0;i--)
{
b[m]=s2[i]-'0';
m++;
}
-
数组相加
for(int i=0;i<(x>y?x:y);i++)//以最长的数组为基准
{
c[i]+=a[i]+b[i];
if(c[i]>=10) //注意进位
{
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
}
-
逆序输出
if(c[(x>y?x:y)]!=0) //注意进位输出
{
cout<<c[(x>y?x:y)];
}
for(int i=(x>y?x:y)-1;i>=0;i--)//逆序输出
{
cout<<c[i];
}
完整代码
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
//输入字符串
int a[250]={0};
int b[250]={0};
int c[250]={0};
string s1,s2;
getline(cin,s1);
getline(cin,s2);
//字符串转逆序数组
int x=s1.size();
int y=s2.size();
int n=0;
int m=0;
for(int i=x-1;i>=0;i--)
{
a[n]=s1[i]-'0';
n++;
}
for(int i=y-1;i>=0;i--)
{
b[m]=s2[i]-'0';
m++;
}
//实现加法
for(int i=0;i<(x>y?x:y);i++)
{
c[i]+=a[i]+b[i];
if(c[i]>=10)
{
c[i+1]+=c[i]/10;
c[i]=c[i]%10;
}
}
//输出
if(c[(x>y?x:y)]!=0)
{
cout<<c[(x>y?x:y)];
}
for(int i=(x>y?x:y)-1;i>=0;i--)
{
cout<<c[i];
}
return 0;
}
高精度乘法
代码实现
- 输入字符串
//初始化数组存储
int a[250]={0};
int b[250]={0};
int c[251]={0};
//定义字符串,输入字符串
string s1,s2;
getline(cin,s1);
getline(cin,s2);
- 字符串转逆序数组
int x=s1.size();
int y=s2.size();
int n=0;
int m=0;
for(int i=x-1;i>=0;i--)//x-1,避免数组越界
{
a[n]=s1[i]-'0';//字符转数字
n++;
}
for(int i=y-1;i>=0;i--)
{
b[m]=s2[i]-'0';
m++;
}
- 循环相乘并相加
for(int i=0;i<x;i++)//两层for循环
{
for(int j=0;j<y;j++)
{
c[j+i]+=a[i]*b[j];
if(c[j+i]>=10) //进位
{
c[j+i+1]+=c[j+i]/10;
c[j+i]=c[j+i]%10;
}
}
}
- 逆序输出
可以根据科学计数法相乘规律可知,x位整数乘以y位整数,不大于(x+y)位整数
int p=0;
for(int i=x+y-1;i>=0;i--)//确定位数
{
if(c[i]!=0)
{
p=i;
break;
}
}
for(int i=p;i>=0;i--)//逆序输出
{
cout<<c[i];
}
完整代码
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
//输入字符串
int a[250]={0};
int b[250]={0};
int c[250]={0};
string s1,s2;
getline(cin,s1);
getline(cin,s2);
//字符串转逆序数组
int x=s1.size();
int y=s2.size();
int n=0;
int m=0;
for(int i=x-1;i>=0;i--)
{
a[n]=s1[i]-'0';
n++;
}
for(int i=y-1;i>=0;i--)
{
b[m]=s2[i]-'0';
m++;
}
//乘法运算
for(int i=0;i<x;i++)
{
for(int j=0;j<y;j++)
{
c[j+i]+=a[i]*b[j];
if(c[j+i]>=10)
{
c[j+i+1]+=c[j+i]/10;
c[j+i]=c[j+i]%10;
}
}
}
//逆序输出
int p=0;
for(int i=x+y-1;i>=0;i--)
{
if(c[i]!=0)
{
p=i;
break;
}
}
for(int i=p;i>=0;i--)
{
cout<<c[i];
}
return 0;
}
烧脑,啊啊啊啊啊啊啊啊啊啊啊啊啊,窝不想思考,窝没有脑子哇哇哇
小应用
用高精度计算出 S=1!+2!+3!+⋯+n!S=1!+2!+3!+⋯+n!(n≤50n≤50)。
#include<iostream>
#include<cstdio>
using namespace std;
int n,a[101]={0},s[101]={0};
void change(int x) //乘法
{
int g=0;
for(int i=100;i>=0;i--)
{
a[i]=a[i]*x+g;
//进位
g=a[i]/10;
a[i]=a[i]%10;
}
}
void qh() //加法
{
int g=0;
for(int i=100;i>=0;i--)
{
s[i]=s[i]+a[i]+g;
//进位
g=s[i]/10;
s[i]=s[i]%10;
}
}
void sc() //输出
{
int w;
for(int i=0;i<=100;i++)
{
if(s[i]!=0)
{
w=i;
break;
}
}
for(int i=w;i<=100;i++)
printf("%d",s[i]);
}
int main()
{
scanf("%d",&n);
s[100]=a[100]=1;
for(int i=2;i<=n;i++)
{
change(i);
qh();
}
sc();
return 0;
}