223行
2025-02-06 12:34:02
发布于:浙江
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdalign>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cwchar>
#include <cwctype>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <bits/stdc++.h>
#include <unordered_set>
using namespace std;
char A[100005], B[100005];
struct node{
short a[100005] = {0};
int len = 0, f = 1;
void _init(char *A){
len = strlen(A);
for(int i = 0; i < len; i++){
a[len - i] = A[i] - '0';
}
}
void print(){
for(int i = len; i >= 1; i--) cout << a[i];//倒序输出
}
node cpy(node a, int dst){//除法的靠右对齐函数
node tmp;
tmp.f = a.f, tmp.len = a.len + dst - 1;
for(int i = 1; i <= a.len; i++){
tmp.a[i + dst - 1] = a.a[i];
}return tmp;
}
bool operator > (node &b){
if(len > b.len) return 1;//比较长度
if(len < b.len) return 0;
for(int i = len; i >= 1; i--){
if(a[i] > b.a[i]) return 1;//逐位比较
if(a[i] < b.a[i]) return 0;
}return 0;
}
bool operator < (node &b){
if(len > b.len) return 0;//比较长度
if(len < b.len) return 1;
for(int i = len; i >= 1; i--){
if(a[i] > b.a[i]) return 0;//逐位比较
if(a[i] < b.a[i]) return 1;
}return 0;
}
bool operator <= (node &b){
return !(*this > b);
}
bool operator >= (node &b){
return !(*this < b);
}
node operator + (node &b){//加法
node c;
c.len = max(len, b.len);
for(int i = 1; i <= c.len; i++){
c.a[i] += a[i] + b.a[i];
if(c.a[i] >= 10) c.a[i + 1], c.a[i] -= 10;//进位
}if(c.a[c.len + 1]) c.len;
while(c.a[c.len] == 0 && c.len > 1) c.len--;
return c;
}
node operator - (node &b){//减法
node c;
if(b > *this){//处理负数情况
swap(*this, b);
c.f = -1;
}
c.len = len;
for(int i = 1; i <= len; i++){
c.a[i] += a[i] - b.a[i];
if(c.a[i] < 0) c.a[i + 1]--, c.a[i] += 10;//借位
}while(c.a[c.len] == 0 && c.len > 1) c.len--;
return c;
}
node operator * (node &b){//乘法
node c;
c.len = len + b.len;
for(int i = 1; i <= len; i++){
int x = 0;
for(int j = 1; j <= b.len; j++){
int weishu = i + j - 1;
c.a[weishu] += x + a[i] * b.a[j];
x = c.a[weishu] / 10;
c.a[weishu] %= 10;
}c.a[i + b.len] = x;
}while(c.a[c.len] == 0 && c.len > 1) c.len--;
return c;
}
node operator / (node &b){//除法(难度突增!)
node c;
if(*this < b) return c;
c.len = len - b.len + 1;
for(int i = c.len; i >= 1; i--){
node tmp = cpy(b, i);//右对齐
while(*this >= tmp){//不断相减
c.a[i]++;
*this -= tmp;
}
}while(c.a[c.len] == 0 && c.len > 1) c.len--;
return c;
}node operator % (node &b){//取余
if(*this < b) return *this;
int len = len - b.len + 1;
for(int i = len; i >= 1; i--){
node tmp = _cpy(b, i);
while(*this >= tmp){
*this -= tmp;
}
}return *this;
}
node operator ^ (node &b){//乘方
node null;
null.f = -1;
if(b.len > 18) return null;//太大了
node tmp;
tmp.len = tmp.a[1] = 1;
long long t = 0;
for(int i = b.len; i >= 1; i--){//处理成long long
t = t * 10 + b.a[i];
}
while(t){
if(t & 1){
if(len + tmp.len > 1e6) return null;//太大了
tmp *= *this;//乘
}
if(len + len > 1e6) return null;
*this *= *this, t >>= 1;//自乘
}return tmp;
}
void operator += (node &b){
*this = *this + b;
}
void operator -= (node &b){
*this = *this - b;
}
void operator *= (node &b){
*this = *this * b;
}
void operator /= (node &b){
*this = *this / b;
}
void operator %= (node &b){
*this = *this % b;
}
void operator ^= (node &b){
*this = *this ^ b;
}
};
int main(){
node a, b, c;
cin >> A >> B;
a._init(A), b._init(B);
c = a + b;
c.print();
}
这里空空如也
有帮助,赞一个