高精度加法
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAX=1e5;
ll a[MAX],b[MAX]; //数组的大小决定了最高位数
string s1,s2;
int main()
{
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
cin >> s1 >> s2;
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end()); // 反转字符串
a[0] = s1.length(); // 取得s1的长度
for(int i = 1;i <= a[0] ;i++){
a[i] = s1[i-1]-'0'; //把字符转化为数字并将其存入数组a中
}
b[0] = s2.length(); // 取得s2的长度
for(int i = 1;i <= b[0];i++){
b[i] =s2[i-1]-'0';
}
ll len = max(a[0],b[0]); //取s1,s2长度的的较大值
for(int i = 1;i <= len ;i++){
a[i] += b[i]; //求和
a[i+1] += a[i] / 10; //进位
a[i] = a[i] % 10; //求得本位
}
len ++;
while(a[len] == 0 && len > 1) len--; //去掉前面的0(最高位没有进位的话,最高位为0)
for(ll i = len ; i > 0 ;i -- ){
cout<<a[i];
}
return 0;
}高精度乘法
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5;
typedef long long ll;
string s1,s2;
ll a[MAX],b[MAX],c[MAX];
ll len;
int main()
{
cin>>s1>>s2;
reverse(s1.begin(),s1.end());
reverse(s2.begin(),s2.end());
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
a[0]=s1.length();
for(int i=1;i<=a[0];i++) a[i]=s1[i-1]-'0';
b[0]=s2.length();
for(int i=1;i<=b[0];i++) b[i]=s2[i-1]-'0';
for(int i=1;i<=a[0];i++){
for(int j=1;j<=b[0];j++){
c[i+j-1] += a[i]*b[j];
c[i+j] += c[i+j-1]/10;
c[i+j-1] %=10;
}
}
len=a[0]+b[0]+1;
while(c[len]==0&&len>1) len--;
for(ll i=len;i>0;i--){
cout<<c[i];
}
return 0;
}
下面的文章讲的非常详细,大家可以去理解一下
https://blog.csdn.net/zsjzliziyang/article/details/82050337

京公网安备 11010502036488号