高精度算法——Step、压位及其应用

在编写程序的时候,常常需要对一些大数据进行处理。然而我们知道,在C/C++中能存储的最大整数为\(2^64-1\)。当要处理的大数据超过这个范围时,就要用到所谓的高精度算法了,原理其实就是对竖式计算的模拟(特别的,除法需要试商)。

实际编写时,我们会发现一位一位地运算很费时间,因此考虑如何提高效率,在这里需要用到\(bitset\)中用到的压位思想,即4位或8位地存储、运算。最常用的是压4位,这样乘法不会溢出。但这样的话,作除法时一位一位试商就太慢了,因此需要二分试商。

#include <algorithm>
#include <cstring>
#include <cstdio>

const int MAXL = 100;
struct bign {
        static const int BASE = 10000;
        static const int WIDTH = 4;

        int len, v[MAXL];

        bign()
        {
                len = 0;
                memset(v, 0, sizeof(v));
        }

        bign operator = (unsigned long long n)
        {
                while (n > 0) {
                        v[++len] = n % BASE;
                        n /= BASE;
                }

                return *this;
        }

        bign operator = (char *s)
        {
                int tmp = 0, x = 1;

                for (int i = strlen(s) - 1; i >= 0; i--) {
                        tmp += x * (s[i] - 48);
                        x *= 10;

                        if (x == BASE) {
                                v[++len] = tmp;
                                tmp = 0;
                                x = 1;
                        }
                }

                if (tmp) {
                        v[++len] = tmp;
                }

                return *this;
        }

        inline void read()
        {
                char s[MAXL << 2];

                scanf("%s", s);
                *this = s;

                return;
        }

        inline void write()
        {
                printf("%d\n", v[len]);
                for (int i = len; i >= 1; i--)
                        printf("%04d", v[i]);

                return;
        }
};

猜你喜欢

转载自www.cnblogs.com/skydreamer/p/9430748.html