高精度模板

转载 2015年11月18日 18:28:14
#include <stdio.h>  
#include <string.h>  
#include <math.h>  
  
  
#define max(a,b) (a)>(b)?(a):(b)  
#define min(a,b) (a)<(b)?(a):(b)  
  
const int MAXSIZE = 1005;  
  
struct bign {  
    int s[MAXSIZE];  
    bign () {memset(s, 0, sizeof(s));}  
    bign (int number) {*this = number;}  
    bign (const char* number) {*this = number;}  
      
    void put();  
    bign mul(int d);  
    void del();  
      
    bign operator =  (char *num);  
    bign operator =  (int num);  
  
    bool operator <  (const bign& b) const;  
    bool operator >  (const bign& b) const { return b < *this; }  
    bool operator <= (const bign& b) const { return !(b < *this); }  
    bool operator >= (const bign& b) const { return !(*this < b); }  
    bool operator != (const bign& b) const { return b < *this || *this < b;}  
    bool operator == (const bign& b) const { return !(b != *this); }  
      
    bign operator + (const bign& c);  
    bign operator * (const bign& c);  
    bign operator - (const bign& c);  
    int  operator / (const bign& c);  
    bign operator / (int k);  
    bign operator % (const bign &c);  
    int  operator % (int k);  
    void operator ++ ();  
    bool operator -- ();  
};  
  
  
bign bign::operator = (char *num) {  
    s[0] = strlen(num);  
    for (int i = 1; i <= s[0]; i++)  
        s[i] = num[s[0] - i] - '0';  
    return *this;  
}  
  
bign bign::operator = (int num) {  
    char str[MAXSIZE];  
    sprintf(str, "%d", num);  
    return *this = str;  
}  
  
bool bign::operator < (const bign& b) const {  
    if (s[0] != b.s[0])  
        return s[0] < b.s[0];  
    for (int i = s[0]; i; i--)  
        if (s[i] != b.s[i])  
            return s[i] < b.s[i];  
    return false;  
}  
  
bign bign::operator + (const bign& c) {  
    int sum = 0;  
    bign ans;  
    ans.s[0] = max(s[0], c.s[0]);  
  
    for (int i = 1; i <= ans.s[0]; i++) {  
        if (i <= s[0]) sum += s[i];  
        if (i <= c.s[0]) sum += c.s[i];  
        ans.s[i] = sum % 10;  
        sum /= 10;  
    }  
    return ans;  
}  
  
bign bign::operator * (const bign& c) {  
    bign ans;  
    ans.s[0] = 0;   
  
    for (int i = 1; i <= c.s[0]; i++){    
        int g = 0;    
  
        for (int j = 1; j <= s[0]; j++){    
            int x = s[j] * c.s[i] + g + ans.s[i + j - 1];    
            ans.s[i + j - 1] = x % 10;    
            g = x / 10;    
        }    
        int t = i + s[0] - 1;  
  
        while (g){    
            ++t;  
            g += ans.s[t];  
            ans.s[t] = g % 10;  
            g = g / 10;    
        }    
  
        ans.s[0] = max(ans.s[0], t);  
    }    
    ans.del();  
    return ans;  
}  
  
bign bign::operator - (const bign& c) {  
    bign ans = *this;  
    for (int i = 1; i <= c.s[0]; i++) {  
        if (ans.s[i] < c.s[i]) {  
            ans.s[i] += 10;  
            ans.s[i + 1]--;;  
        }  
        ans.s[i] -= c.s[i];  
    }  
  
    for (int i = 1; i <= ans.s[0]; i++) {  
        if (ans.s[i] < 0) {  
            ans.s[i] += 10;  
            ans.s[i + 1]--;  
        }  
    }  
  
    ans.del();  
    return ans;  
}  
  
int bign::operator / (const bign& c) {  
    int ans = 0;  
    bign d = *this;  
    while (d >= c) {  
        d = d - c;  
        ans++;  
    }  
    return ans;  
}  
  
bign bign::operator / (int k) {  
    bign ans;   
    ans.s[0] = s[0];  
    int num = 0;    
    for (int i = s[0]; i; i--) {    
        num = num * 10 + s[i];    
        ans.s[i] = num / k;    
        num = num % k;    
    }    
    ans.del();  
    return ans;  
}  
  
int bign:: operator % (int k){    
    int sum = 0;    
    for (int i = s[0]; i; i--){    
        sum = sum * 10 + s[i];    
        sum = sum % k;    
    }    
    return sum;    
}   
  
bign bign::operator % (const bign &c) {  
    bign now = *this;  
    while (now >= c) {  
        now = now - c;  
        now.del();  
    }  
    return now;  
}  
  
void bign::operator ++ () {  
    s[1]++;  
    for (int i = 1; s[i] == 10; i++) {  
        s[i] = 0;  
        s[i + 1]++;  
        s[0] = max(s[0], i + 1);  
    }  
}  
  
bool bign::operator -- () {  
    del();  
    if (s[0] == 1 && s[1] == 0) return false;  
  
    int i;  
    for (i = 1; s[i] == 0; i++)  
        s[i] = 9;  
    s[i]--;  
    del();  
    return true;  
}  
  
void bign::put() {  
    if (s[0] == 0)  
        printf("0");  
    else  
        for (int i = s[0]; i; i--)  
            printf("%d", s[i]);  
}  
  
bign bign::mul(int d) {  
    s[0] += d;  
    for (int i = s[0]; i > d; i--)  
        s[i] = s[i - d];  
    for (int i = d; i; i--)  
        s[i] = 0;  
    return *this;  
}  
  
void bign::del() {  
    while (s[s[0]] == 0) {  
        s[0]--;  
        if (s[0] == 0) break;  
    }  
}  

高精度模板(C语言)

  • 2014年05月07日 08:56
  • 23KB
  • 下载

高精度加、减、乘、除模板

  • 2008年11月04日 11:05
  • 4KB
  • 下载

Java处理高精度问题模板

java 处理高精度计算 Double.valueOf(String) and Float.valueOf(String)都会丢失精度。 为了解决这个问题,需要用到BigDecimal类。 使用的...
  • dtwd886
  • dtwd886
  • 2016年05月06日 19:52
  • 116

acm大数高精度模板

  • 2017年01月19日 14:27
  • 31KB
  • 下载

高精度模板

  • 2014年08月05日 23:00
  • 3KB
  • 下载

【高精度计算】加减乘模板(水)

所有的高精度计算都很相似(除以外),都是模拟小学生算数列竖式,借位进位之类的,最主要的难点应该就只有判重和0上了吧,233好像没什么可说的了...

大数(高精度)模板基础教材

  • 2011年05月22日 16:10
  • 997KB
  • 下载

【BZOJ2179】FFT快速傅立叶 高精度乘模板题

题解: 其实没什么题解,只是贴个模板+理解注释 代码: #include #include #include #include #include #include using n...
  • Vmurder
  • Vmurder
  • 2015年03月02日 10:39
  • 1515

大数(相加,高精度)模板

AC ,bar 时间限制:1000 ms  |  内存限制:65535 KB 描述   zsjing一直很郁闷,为什么别人胡搞一下就可以AC。而他一胡搞就是Wrong呢?囧...... ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:高精度模板
举报原因:
原因补充:

(最多只允许输入30个字)