• 高精度封装


    为了保证效率,部分代码拆开CV了一下。

    #include<bits/stdc++.h>
    using namespace std;
    #define rg register
    #define I inline
    #define gc getchar
    #define rep(i, a, b) for(int i = a; i <= b; ++i)
    #define per(i, a, b) for(int i = a; i >= b; --i)
    I int read(){
    	rg char ch = gc();
    	rg int x = 0, f = 0;
    	while(!isdigit(ch)) f |= (ch == '-'), ch = gc();
    	while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = gc();
    	return f ? -x : x; 
    }
    I void put(int x){
    	if(!x){ putchar('
    '); return;}
    	putchar((x % 10) ^ 48);
    	put(x / 10);
    }
    const int N = 43;
    int n, k;
    struct node{
    	int len;
    	vector<int> c;
    	bool flag;
    	node(){
    		len = 0; flag = false;
    		c.clear();
    	}
    	const bool operator < (const node &rhs){
    		if(len < rhs.len) return true;
    		if(len > rhs.len) return false;
    		per(i, len - 1, 0){
    			if(c[i] < rhs.c[i]) return true;
    			if(c[i] > rhs.c[i]) return false;
    		}
    		return false;
    	}
    	node operator + (const node &rhs){
    		if(flag == rhs.flag){
    			node v;
    			v.flag = flag;
    			rg int now, l(0), n = v.len = max(len, rhs.len);
    			rep(i, 0, n - 1){
    				now = (i < len ? c[i] : 0) + (i < rhs.len ? rhs.c[i] : 0) + l;
    				//cout << c[i] << " " << rhs.c[i] << " " << now << " " << l << endl;
    				v.c.push_back(now % 10);
    				l = now / 10;
    			}
    			if(l) ++v.len, v.c.push_back(l);
    			while(v.len && !(*(v.c.end() - 1))) --v.len, v.c.pop_back();
    			return v;
    		}else{
    			node v;
    			rg int now, l(0), n = v.len = max(len, rhs.len);
    			if((*this) < rhs){
    				v.flag = !flag;
    				rep(i, 0, n - 1){
    					now = rhs.c[i] - (i < len ? c[i] : 0) + l;
    					//cout << c[i] << " " << rhs.c[i] << " " << now << " " << l << endl;
    					if(now < 0) now += 10, l = -1;
    					else l = now / 10;
    					v.c.push_back(now % 10);
    				}
    				if(l) ++v.len, v.c.push_back(l);
    				while(v.len && !(*(v.c.end() - 1))) --v.len, v.c.pop_back();
    				return v;
    			}else{
    				v.flag = flag;
    				rep(i, 0, n - 1){
    					now = c[i] - (i < rhs.len ? rhs.c[i] : 0) + l;
    					//cout << c[i] << " " << rhs.c[i] << " " << now << " " << l << endl;
    					if(now < 0) now += 10, l = -1;
    					else l = now / 10;
    					v.c.push_back(now % 10);
    				}
    				if(l) ++v.len, v.c.push_back(l);
    				while(v.len && !(*(v.c.end() - 1))) --v.len, v.c.pop_back();
    				return v;
    			}
    			//copy -
    		}
    	}
    	node operator - (const node &rhs){
    		if(flag == rhs.flag){
    			node v;
    			rg int now, l(0), n = v.len = max(len, rhs.len);
    			if((*this) < rhs){
    				v.flag = !flag;
    				rep(i, 0, n - 1){
    					now = rhs.c[i] - (i < len ? c[i] : 0) + l;
    					//cout << c[i] << " " << rhs.c[i] << " " << now << " " << l << endl;
    					if(now < 0) now += 10, l = -1;
    					else l = now / 10;
    					v.c.push_back(now % 10);
    				}
    				if(l) ++v.len, v.c.push_back(l);
    				while(v.len && !(*(v.c.end() - 1))) --v.len, v.c.pop_back();
    				return v;
    				// copy +
    			}else{
    				v.flag = flag;
    				rep(i, 0, n - 1){
    					now = c[i] - (i < rhs.len ? rhs.c[i] : 0) + l;
    					//cout << c[i] << " " << rhs.c[i] << " " << now << " " << l << endl;
    					if(now < 0) now += 10, l = -1;
    					else l = now / 10;
    					v.c.push_back(now % 10);
    				}
    				if(l) ++v.len, v.c.push_back(l);
    				while(v.len && !(*(v.c.end() - 1))) --v.len, v.c.pop_back();
    				return v;
    			}
    		}else{
    			node t = rhs; t.flag = flag;
    			return *this + t;
    		}
    	}
    	node operator * (const int x){
    		node v;
    		rg int now, l(0);
    		rep(i, 0, len - 1){
    			now = c[i] * x + l;
    			v.c.push_back(now % 10);
    			l = now / 10;
    		}
    		v.len = len;
    		if(l) ++v.len, v.c.push_back(l);
    	}
    	node operator * (const node &rhs) const {
    		node v;
    		v.len = len + rhs.len + 1;
    		v.c.resize(v.len);
    		rep(i, 0, len - 1) rep(j, 0, rhs.len - 1) v.c[i + j] += c[i] * rhs.c[j];
    		rep(i, 0, v.len - 2){
    			v.c[i + 1] += v.c[i] / 10;
    			v.c[i] %= 10;
    		}
    		while(v.len && !(*(v.c.end() - 1))) v.c.pop_back(), --v.len;
    		return v;
    	}
    	I node(int x){
    		len = 0; c.clear(); flag = false;
    		while(x){
    			c.push_back(x % 10);
    			x /= 10;
    		}
    		len = c.size();
    	}
    	I node(char* s){
    		c.clear(); flag = false;
    		len = strlen(s + 1);
    		per(i, len, 1) c.push_back(s[i] ^ 48);
    	}
    	I void init(int x){
    		c.clear(); flag = false;
    		while(x){
    			c.push_back(x % 10);
    			x /= 10;
    		}
    		len = c.size();
    	}
    	I void init(char* s){
    		c.clear(); flag = false;
    		len = strlen(s + 1);
    		per(i, len, 1) c.push_back(s[i] ^ 48);
    	}
    	I void output(){
    		//cout << len << endl;
    		if(!len){putchar('0'); return;}
    		if(flag) putchar('-');
    		per(i, len - 1, 0) putchar(c[i] ^ 48);
    		putchar('
    ');
    	}
    }f[N][7];
    char s[N];
    int main(){
    	
    	return 0;
    }
    
  • 相关阅读:
    vue中的$event
    vue实现div拖拽互换位置
    关于marquee首次加载出现闪跳问题
    微信小程序之深色模式下样式的写法
    html动态添加公共页头和页脚
    微信小程序改变上一页面的数据,页面中的通信
    mui中的a标签无效和click无法点击的问题
    mui.DtPicker is not a constructor解决方案
    mui-slider选项卡设置默认index
    flutter环境配置遇到的一些坑
  • 原文地址:https://www.cnblogs.com/XiaoVsun/p/14975904.html
Copyright © 2020-2023  润新知