小心作者
2024-04-24 18:12:19
发布于:浙江
6阅读
0回复
0点赞
可能有坑,所以用高精就行了
CODE:
#include <bits/stdc++.h>
using namespace std;
const int MAX_LEN = 50000;
struct BigInt
{
int v[MAX_LEN];
int len;
int sign;
BigInt(int n) {
memset(v,0,sizeof(v));
if (n>=0){
sign=1;
}
else{
sign=-1;
}
int i=0;
while (true){
v[i++]=n%10;
n/=10;
if (n==0){
break;
}
}
len=i;
}
BigInt(const char* a) {
len=strlen(a);
if (a[0]=='-'){
sign=-1;
len-=1;
for (int i=0;i<=len;++i){
if (a[len-i]!='-'){
v[i]=a[len-i]-'0';
}
}
}
else{
sign=1;
for (int i=0;i<len;++i){
v[len-i-1]=a[i]-'0';
}
}
}
int compare(const BigInt& b) {
if (len<b.len){
return -1;
}
if (len>b.len){
return 1;
}
for (int i=len-1;i>=0;--i){
if (v[i]<b.v[i]){
return -1;
}
if (v[i]>b.v[i]){
return 1;
}
}
return 0;
}
void add(const BigInt& b) {
int i=0,x=0;
int blen=b.len;
while ((i<len) || (i<blen)){
v[i]=v[i]+b.v[i]+x;
x=v[i]/10;
v[i]%=10;
++i;
}
if (x > 0){
v[i]=x;
len = i + 1;
} else {
len = i;
}
}
void sub(const BigInt& b) {
int i=0,x=0,y[MAX_LEN];
int blen=b.len;
int f=compare(b);
if (f==0){
len=1;
v[0]=0;
return;
}
if (f>=1){
for (i=0;i<len;++i){
if (v[i]<b.v[i]){
v[i]+=10;
v[i+1]-=1;
}
v[i]-=b.v[i];
}
for (int i=len-1;i>=0;--i){
if (v[i]==0){
len-=1;
}
else{
break;
}
}
}
else{
for (i=0;i<len;++i){
if (b.v[i]<v[i]){
//b.v[i]+=10;
v[i+1]-1;
}
v[i]-=b.v[i];
}
for (int i=0;i<len;++i){
if (v[i]==0){
len-=1;
}
}
}
}
void mul(const BigInt& b) {
int c[MAX_LEN];
memset(c,0,sizeof(c));
for (int i=0;i<len;++i){
int x=0;
for (int j=0;j<b.len;++j){
c[i+j]=v[i]*b.v[j]+x+c[i+j];
x=c[i+j]/10;
c[i+j]=c[i+j]%10;
}
c[i+b.len]=x;
}
memcpy(v,c,sizeof(c));
len = len + b.len;
while(v[len-1]==0){
len--;
}
}
void mul(int b)
{
int x=0;
for (int i=0;i<len;++i){
v[i]=v[i]*b+x;
x=v[i]/10;
v[i]=v[i]%10;
}
while (x) {
v[len++]=x%10;
x/=10;
}
}
void div(int b,int& m) {
int x=0;
for (int i=len-1;i>=0;--i){
int t=v[i];
v[i]=(x*10+v[i])/b;
x=(x*10+t)%b;
}
m = x;
for (int i=len-1;i>=0;--i){
if (v[i]==0){
len-=1;
}
else{
break;
}
}
}
void div(int b) {
long long x=0;
for (int i=len-1;i>=0;--i){
int t=v[i];
v[i]=(x*10+v[i])/b;
x=(x*10+t)%b;
//cout << x << endl;
}
for (int i=len-1;i>=1;--i){
if (v[i]==0){
len-=1;
}
else{
break;
}
}
}
void div(const BigInt&b) {
int x=0;
for (int i=len-1;i>=0;--i){
for (int j=0;j<b.len;++j){
int t=v[i];
v[i]=(x*10+v[i])/b.v[j];
x=(x*10+t)%b.v[j];
}
}
for (int i=len-1;i>=0;--i){
if (v[i]==0){
len-=1;
}
else{
break;
}
}
}
};
std::ostream& operator<<(std::ostream& os, const BigInt& b)
{
if (b.sign<0){
cout<<"-";
}
for(int i = b.len - 1;i >= 0; --i){
os << b.v[i];
}
return os;
}
int main()
{
char a[1000],b[1000];
cin>>a>>b;
BigInt n(a),m(b);
n.add(m);
n.sub(m);
n.add(m);
cout<<n<<endl;
}
这里空空如也
有帮助,赞一个