#include <bits/stdc++.h>
using namespace std;
//
const int maxn = 100005;
char a[maxn]={0};
char b[maxn]={0};
int res[maxn] = {0};
//
void add(char *a,char *b)
{
int lena = strlen(a);
int lenb = strlen(b);
reverse(a,a+lena);
reverse(b,b+lenb);
int len = max(lena,lenb);
for(int i=0;i<len;++i)
{
res[i] += (i>=lena?0:a[i]-'0') + (i>=lenb?0:b[i]-'0');
if(res[i] >= 10)
{
res[i+1]+=res[i]/10;
res[i]%=10;
}
}
if(res[len] > 0) printf("%d",res[len]);
for(int i=len-1;i>=0;--i)
printf("%d",res[i]);
printf("\n");
}
int main()
{
scanf("%s%s",a,b);
printf("%s\n%s\n",a,b);
add(a,b);
return 0;
}
vector版:
#include <iostream>
#include <vector>
using namespace std;
vector<int> add(vector<int>& a,vector<int>& b)
{
if(a.size() < b.size()) return add(b,a);
vector<int> c;
int t = 0;
for(int i=0;i<a.size();++i)
{
t+=a[i];
if(i<b.size()) t+=b[i];
c.push_back(t%10);
t/=10;
}
if(t) c.push_back(t);
return c;
}
int main()
{
string a,b;
cin>>a>>b;
vector<int> A,B;
for(int i=a.size()-1;i>=0;--i)
A.push_back(a[i]-'0');
for(int i=b.size()-1;i>=0;--i)
B.push_back(b[i]-'0');
auto C = add(A,B);
for(int i=C.size()-1;i>=0;--i)
printf("%d",C[i]);
}
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100005;
char a[maxn];
char b[maxn];
int res[maxn]={0};
void sub(char * a, char * b)
{
memset(res,0,sizeof(res));
int lena = strlen(a);
int lenb = strlen(b);
reverse(a,a+lena);
reverse(b,b+lenb);
if(strlen(a) < strlen(b))
{
printf("-");
swap(a,b);
}
if(strlen(a) == strlen(b))
{
for(int i=lena-1;i>=0;i--)
{
if(b[i] < a[i]) break;
if(b[i] == a[i]) continue;
if(b[i] > a[i])
{
printf("-");
swap(a,b);
break;
}
}
}
int len = max(lena,lenb);
for(int i=0;i<len;i++)
{
res[i] += a[i] ? a[i] - '0' : 0 ;
res[i] -= b[i] ? b[i] - '0' : 0 ;
if(res[i] < 0)
{
res[i+1] -= 1;
res[i] += 10;
}
}
while(res[len-1] == 0 && len > 1) --len;
if(len == 1)
{
printf("0");
return;
}
for(int i=len-1;i>=0;--i)
printf("%d",res[i]);
}
int main()
{
scanf("%s%s",a,b);
sub(a,b);
return 0;
}
高精乘以int
#include <bits/stdc++.h>
using namespace std;
vector<int> mul(vector<int>& a,int b)
{
int lena = a.size();
//int lenb = log10(b)+1;
vector<int> re;
int t=0;
for(int i=0;i<lena;i++)
{
t += a[i] * b;
re.push_back(t%10);
t/=10;
}
while(t)
{
re.push_back(t%10);
t/=10;
}
while(re.size() > 1 && re.back() == 0)
re.pop_back();
return re;
}
int main()
{
string A;
int b;
cin>>A>>b;
vector<int> a;
for(int i=A.size()-1;i>=0;--i)
{
a.push_back(A[i] - '0');
}
auto re = mul(a,b);
for(int i=re.size()-1;i>=0;--i)
printf("%d",re[i]);
return 0;
}
高精乘以高精
#include <bits/stdc++.h>
using namespace std;
vector<int> mul(vector<int>& a,vector<int>& b)
{
int lena = a.size();
int lenb = b.size();
if(lena<lenb) return mul(b,a);
vector<int> re(lena+lenb,0);
for(int i=0;i<lena;i++)
{
for(int j=0;j<lenb;j++)
{
re[i+j] += a[i]*b[j];
}
}
for(int i=0;i<re.size()-1;i++)
{
re[i+1] += re[i] / 10;
re[i] %= 10;
}
int t = re.back();
re.back() = t%10;
t/=10;
while(t)
{
re.push_back(t%10);
t/=10;
}
while(re.size() > 1 && re.back() == 0)
re.pop_back();
return re;
}
int main()
{
string A;
string B;
cin>>A>>B;
vector<int> a,b;
for(int i=A.size()-1;i>=0;--i) a.push_back(A[i] - '0');
for(int i=B.size()-1;i>=0;--i) b.push_back(B[i] - '0');
auto re = mul(a,b);
for(int i=re.size()-1;i>=0;--i)
printf("%d",re[i]);
return 0;
}
高精除以高精还没写 ,面是高精除以int版本
#include <bits/stdc++.h>
using namespace std;
vector<int> div(vector<int>& a,int b,int& yu)
{
vector<int> re;
int r=0; //余数
for(int i=0;i<a.size();++i)
{
if(r < b) r = r * 10 + a[i];
re.push_back(r/b);
r %= b;
}
yu = r;
while(re.size() > 1 && *re.begin() == 0) re.erase(re.begin());
return re;
}
int main()
{
string A;
int b;
cin>>A>>b;
vector<int> a;
for(int i=0;i<A.size();++i) a.push_back(A[i]-'0'); //正序存放
int yu=0;
auto C = div(a,b,yu);
for(int& i : C)
printf("%d",i);
printf("\n%d",yu);
return 0;
}
/*
1≤A的长度≤100000,
1≤B≤10000
B 一定不为0
*/