首页 > 其他分享 >高精

高精

时间:2023-09-24 09:01:11浏览次数:29  
标签:return int big len 高精 operator const

Part 1:无除法取模无压位

#include<bits/stdc++.h>
#define F(i,i0,n) for(int (i)=(i0);(i)<=(n);++(i))
#define pii pair<int,int>
#define fr first
#define sc second
using namespace std;
inline int rd() {
    int f = 0, x = 0;char ch = getchar();
    while(!isdigit(ch)) {if(ch == '-')f = 1;ch = getchar();}
    while(isdigit(ch)) {x = (x << 3) + (x << 1) + ch - 48;ch = getchar();}
    return f ? -x : x;
}
const int N = 5e4 + 5;
const int P = 10, MAXP = 5005;
struct big {
    int len, d[MAXP];
    big() {
        memset(d, 0, sizeof(d));
        len = 1;
    }
    big(int num) {*this = num;}
    big(const char *c) {*this = c;}
    big operator =(int num) {
        len = 0;
        while(num) {
            d[len++] = num % 10;
            num /= 10;
        }
        return *this;
    }
    big operator =(const char *num) {
        for(int i = 0; num[i] == '0'; num++);//去前导0 
        len = strlen(num);
        if(!len){
            d[0]=0;len=1;
            return *this;
        }
        for(int i = 0; i < len; ++i)
            d[i] = num[len - i - 1] - '0';
        return *this;
    }
    big operator +(const big &b)const {
        big c;
        c.len = 0;
        for(int i = 0, g = 0; g || i < max(len, b.len); ++i) {
            int x = g;
            if(i < len)x += d[i];
            if(i < b.len)x += b.d[i];
            c.d[c.len++] = x % 10;
            g = x / 10;
        }
        return c;
    }
    void clean() {
        while(len > 1 && !d[len - 1])len--;
    }
    big operator *(const big &b) const {
        big c;
        c.len = len + b.len;
        for(int i = 0; i < len; ++i)
            for(int j = 0; j < b.len; ++j)
                c.d[i + j] += d[i] * b.d[j];

        for(int i = 0; i < c.len; ++i) {
            c.d[i + 1] += c.d[i] / 10;
            c.d[i] %= 10;
        }
        c.clean();
        return c;
    }
    big operator -(const big &b)const {
        big c;
        c.len = 0;
        for(int i = 0, g = 0; i < len; ++i) {
            int x = d[i] - g;
            if(i < b.len)x -= b.d[i];
            if(x >= 0)g = 0;
            else {
                g = 1;
                x += 10;
            }
            c.d[c.len++] = x;
        }
        c.clean();
        return c;
    }
    bool operator <(const big &b)const {
        if(len != b.len)return len < b.len;
        for(int i = len - 1; ~i; --i)
            if(d[i] != b.d[i])return d[i] < b.d[i];
        return 0;
    }
    bool operator >(const big &b)const {
        if(len != b.len)return len > b.len;
        for(int i = len - 1; ~i; --i)
            if(d[i] != b.d[i])return d[i] > b.d[i];
        return 0;
    }
    big operator +=(const big &b) {*this = *this + b;return *this;}
    big operator *=(const big &b) {*this = *this * b;return *this;}
    big operator -=(const big &b) {*this = *this - b;return *this;}
    bool operator ==(const big &b) {return !(*this > b) && !(*this < b);}
    bool operator !=(const big &b) {return !(*this == b);}
    bool operator <=(const big &b) {return *this < b || *this == b;}
    bool operator >=(const big &b) {return *this > b || *this == b;}
    void out()const {
        for(int i = len - 1; i >= 0; --i)cout << d[i];
        cout << '\n';
    }
    void in() {
        char t[MAXP];
        scanf("%s", t);
        *this = t;
    }
};
signed main() {
    return 0;
}

Part 2:完全体(别问为什么还是没有压位,因为懒)

#include<bits/stdc++.h>
#define F(i,i0,n) for(int (i)=(i0);(i)<=(n);++(i))
#define pii pair<int,int>
#define fr first
#define sc second
using namespace std;
inline int rd() {
    int f = 0, x = 0;char ch = getchar();
    while(!isdigit(ch)) {if(ch == '-')f = 1;ch = getchar();}
    while(isdigit(ch)) {x = (x << 3) + (x << 1) + ch - 48;ch = getchar();}
    return f ? -x : x;
}
const int N = 5e4 + 5;
const int P = 10, MAXP = 5005;
struct big {
    int len, d[MAXP];
    big() {
        memset(d, 0, sizeof(d));
        len = 1;
    }
    big(int num) {*this = num;}
    big(const char *c) {*this = c;}
    big operator =(int num) {
        len = 0;
        while(num) {
            d[len++] = num % 10;
            num /= 10;
        }
        return *this;
    }
    big operator =(const char *num) {
        for(int i = 0; num[i] == '0'; num++);//去前导0 
        len = strlen(num);
        if(!len){
            d[0]=0;len=1;
            return *this;
        }
        for(int i = 0; i < len; ++i)
            d[i] = num[len - i - 1] - '0';
        return *this;
    }
    big operator +(const big &b)const {
        big c;
        c.len = 0;
        for(int i = 0, g = 0; g || i < max(len, b.len); ++i) {
            int x = g;
            if(i < len)x += d[i];
            if(i < b.len)x += b.d[i];
            c.d[c.len++] = x % 10;
            g = x / 10;
        }
        return c;
    }
    void clean() {
        while(len > 1 && !d[len - 1])len--;
    }
    big operator *(const big &b) const {
        big c;
        c.len = len + b.len;
        for(int i = 0; i < len; ++i)
            for(int j = 0; j < b.len; ++j)
                c.d[i + j] += d[i] * b.d[j];

        for(int i = 0; i < c.len; ++i) {
            c.d[i + 1] += c.d[i] / 10;
            c.d[i] %= 10;
        }
        c.clean();
        return c;
    }
    big operator -(const big &b)const {
        big c;
        c.len = 0;
        for(int i = 0, g = 0; i < len; ++i) {
            int x = d[i] - g;
            if(i < b.len)x -= b.d[i];
            if(x >= 0)g = 0;
            else {
                g = 1;
                x += 10;
            }
            c.d[c.len++] = x;
        }
        c.clean();
        return c;
    }
    big operator /(const big &b)const {
        big c, f = 0;
        for(int i = len - 1; i >= 0; --i) {
            f = f * 10;
            f.d[0] = d[i];
            while(f >= b) {
                f -= b;
                c.d[i]++;
            }
        }
        c.len = len;
        c.clean();
        return c;
    }
    
    big operator%(const big &b) {
        big r = *this / b;
        r = *this - r * b;
        r.clean();
        return r;
    }
    
    bool operator <(const big &b)const {
        if(len != b.len)return len < b.len;
        for(int i = len - 1; ~i; --i)
            if(d[i] != b.d[i])return d[i] < b.d[i];
        return 0;
    }
    bool operator >(const big &b)const {
        if(len != b.len)return len > b.len;
        for(int i = len - 1; ~i; --i)
            if(d[i] != b.d[i])return d[i] > b.d[i];
        return 0;
    }
    big operator +=(const big &b) {*this = *this + b;return *this;}
    big operator *=(const big &b) {*this = *this * b;return *this;}
    big operator -=(const big &b) {*this = *this - b;return *this;}
    big operator /=(const big &b) {*this = *this / b;return *this;}
    big operator %=(const big &b) {*this = *this % b;return *this;}
    bool operator ==(const big &b) {return !(*this > b) && !(*this < b);}
    bool operator !=(const big &b) {return !(*this == b);}
    bool operator <=(const big &b) {return *this < b || *this == b;}
    bool operator >=(const big &b) {return *this > b || *this == b;}
    void out()const {
        for(int i = len - 1; i >= 0; --i)cout << d[i];
        cout << '\n';
    }
    void in() {
        char t[MAXP];
        scanf("%s", t);
        *this = t;
    }
};
signed main() {
    return 0;
}



标签:return,int,big,len,高精,operator,const
From: https://www.cnblogs.com/ussumer/p/17725583.html

相关文章

  • 算法基础之高精度总结
    高精度算法分类分类:加、减、乘、除其中加减乘都适用于两个数都是高精度,除法因为除数是高精度的话不好用整除的方法,所以除法时被除数是高精度,除数是整型。高精度加减乘除的异同点加和乘相同点需要从低位到高位处理for(inti=stra.size()-1;i>=0;i--)c.push_back(stra[i......
  • 高精度乘法
    1#include<iostream>2#include<vector>3usingnamespacestd;45vector<int>mul(vector<int>&A,int&b)6{7vector<int>C;8intt=0;9for(inti=0;i<A.size()||t;i++)10......
  • 基础高精度算法:高精度四则运算
    #if1#include<iostream>#include<vector>#include<algorithm>usingnamespacestd;vector<int>add(vector<int>A,vector<int>B){vector<int>C;intt=0;for(inti=0;i<A.size()||i&l......
  • 高精度数各位数之和
    高精度数各位数之和 描述 输入一个高精度数,输出它各个位数数字之和。 输入 输入一行,包含一个正整数,数字的位数不超过1000位。 输出 输出高精度数的各位数之和。 输入样例1 123456789009876543211234567890输出样例1135 #include<io......
  • 高精度数的绝对值
     高精度数的绝对值 描述 输入一个高精度数,输出它的绝对值。 输入 输入一行,包含一个正整数,数字的位数不超过1000位。 输出 高精度数的绝对值。 输入样例1 -12345678900987654输出样例112345678900987654输入样例2 654321123456......
  • x86 Linux 下实现 10us 误差的高精度延时 | 软件开发 转载文章
    在Linux下实现高精度延时,网上所能找到的大部分方法只能实现50us左右的延时精度。https://mp.weixin.qq.com/s/H6TRsSAcQPGgX03rfsbxGQ作者:董文会(本文字数:4554,阅读时长大约:7分钟)在Linux下实现高精度延时,网上所能找到的大部分方法只能实现50us左右的延时精度。今天让......
  • rtlinux 高精度定时 转载的文章
    主要是RTLinux环境下编程总结,在嵌入版发过,没几个人响应。做过一个有关RTLinux的项目,时间一长,差不多忘光了,现在尽量把原来做过的东西总结一下,以备后用,同时正在做类似项目的一个借鉴平台主机:redhat8.0 目标机:PC104模块、ISA总线脉冲输出、实时串口通信      linux-2.4.18......
  • c++高精度模板
    #include<iostream>#include<stdio.h>#include<string.h>#include<math.h>#include<algorithm>#include<string>#include<vector>#include<list>usingnamespacestd;constintmaxn......
  • 高精度加减法模板
    正整数+-法#include<stdio.h>#include<string.h>voidplus(char*a,char*b,char*c);voidminus(char*a,char*b,char*c);voidminus(char*a,char*b,char*c){ inti,j,k; intla=strlen(a); intlb=strlen(b); intflag=0; memset(c,0......
  • 一套UWB室内外高精度定位系统源码
    智慧工厂是现代工厂信息化发展的新阶段,基于UWB定位技术,融合位置物联网、GIS可视化等技术,实现对人员、物资精确管理。在重点区域设置电子围栏,无权限人员进入即刻告警;对人员超/缺员、串岗滞留等规范化管理,提升工厂的秩序管理及生产效率。定位能力:支持零维、一维、二维等多种定位方式,......