加法
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[150000], b[150000];
int c[150000] = { 0 };
cin >> a >> b;
int la = strlen(a), lb = strlen(b);
int k = max(la, lb); int lenth = k;
for (int i = la - 1, j = lb - 1; i >= 0, j >= 0; i--, j--, k--)
{
c[k] += (a[i] - '0') + (b[j] - '0');
c[k - 1] += c[k] / 10;
c[k] %= 10;
if (i == 0 && j > 0)
{
while (j > 0)
{
c[--k] += (b[--j] - '0');
c[k - 1] += c[k] / 10;
c[k] %= 10;
}
}
if (j == 0 && i > 0)
{
while (i > 0)
{
c[--k] += (a[--i] - '0');
c[k - 1] += c[k] / 10;
c[k] %= 10;
}
}
}
if (c[0] != 0)
cout << c[0];
for (int i = 1; i <= lenth; i++)
{
printf("%d", c[i]);
}
}
///////////////////////////////////////////////////
自定义一个函数感觉写起来更简洁
#include<bits/stdc++.h>
using namespace std;
void sum(char a,char b,int c[],int k)
{
c[k]+=(a-'0')+(b-'0');
c[k-1]+=c[k]/10;
c[k]%=10;
}
int main()
{
char a[150000],b[150000];
int c[150000]={0};cin>>a>>b;
int la = strlen(a),lb = strlen(b);
int k = max(la,lb),lenth = k;
for(int i = la-1,j=lb-1;i>=0,j>=0;i--,j--,k--)
{
sum(a[i],b[j],c,k);
if(i==0&&j>0)
{
while(j>0)sum('0',b[--j],c,--k);
}
if(j==0&&i>0)
{
while(i>0)sum(a[--i],'0',c,--k);
}
}
if(c[0]!=0)cout<<c[0];
for(int i = 1;i<=lenth;i++)printf("%d",c[i]);
}
减法
#include<stdio.h>
#include<string.h>
int main()
{
char a[100000], b[100000]; int c[100000] = { 0 };
scanf("%s%s", a, b);
int la = strlen(a), lb = strlen(b), sign = 1;
int max = la > lb ? la : lb;
if (la < lb || (la == lb && strcmp(a, b) < 0))
{
sign = -sign;
char temp[100000];
strcpy(temp, b);
strcpy(b, a);
strcpy(a, temp);
la = la + lb;
lb = la - lb;
la = la - lb;
}
else if (strcmp(a, b) == 0)
{
printf("0"); return 0;
}
for (int i = la - 1, j = lb - 1, k = max - 1; i >= 0 && j >= 0; j--, i--, k--)
{
c[k] += (a[i] - '0') -( b[j] - '0');
if (c[k] < 0)
{
a[i - 1]--; c[k] += 10;
}
while (j == 0 && i > 0)
{
if (a[i - 1] < '0') { a[i - 1] += 10; a[i - 2]--; }
c[--k] = a[--i] - '0';
}
}
int k = 0; while (!c[k])k++;
printf("%d", sign * c[k]);
while (k <= max - 2)printf("%d", c[++k]);
}
乘法
#include<bits/stdc++.h>
using namespace std;
char a[100000], b[100000];int c[100000] = { 0 };
int main()
{
cin>>a; cin>>b;
int x = strlen(a);
int y = strlen(b);
int k = x+y;
for (int i = x-1; i >= 0; i--)
{ int t = x-i-1;
for (int j = y-1; j >= 0; j--)
{
c[k-t] += (a[i]-'0') *( b[j]-'0'); t++;
}
}
for (int i = k; i >= 0; i--)
{
c[i - 1] += c[i] / 10;
c[i] %= 10;
}
int cnt = -1;
while (!c[++cnt]&&cnt!=k);
for (int i = cnt; i <= k; i++)
cout << c[i];
return 0;
}
除法
(高精度除以单精度)
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[111111]={};int c[111111]={};
int b;
cin>>a;cin>>b;
int r = 0;
int len = strlen(a);
for(int i = 0;i<len;i++)
{
r = r*10 + a[i]-'0';
c[i]=r/b;
r%=b;
}
int k = 0;
while(k<len-1&&c[k]==0)k++;
for(;k<len;k++)cout<<c[k];
cout<<endl<<r;
}
时隔许久再次写的高精度加法
#include<bits/stdc++.h>
using namespace std;
vector<int> c;
string a, b;
void sum(char x, char y, int k)
{
c[k] += x - '0' + y - '0';
c[k - 1] += c[k] / 10;
c[k] %= 10;
}
int main()
{
cin >> a >> b;
int k = max(a.size(), b.size());
c.resize(k + 1);
for (int i = a.size() - 1, j = b.size() - 1; i >= 0 && j >= 0; i--, j--, k--)
{
sum(a[i], b[j], k);
while (i == 0 && j > 0)sum('0', b[--j], --k);
while (j == 0 && i > 0)sum(a[--i], '0', --k);
}
if (c[0])cout << c[0];
for (int i = 1; i < c.size(); i++)cout << c[i];
}