高精度加法&乘法都是把数字转化成数组进行运算,存储
高精度加法
建议多在纸上画画,梳理思路
代码实现
- 输入字符串
//初始化数组存储
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;
}