高精度加法
#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