加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

uva 10494(大数加减乘除取余一条龙模板代码) uva 10023 (大数

发布时间:2020-12-14 03:31:33 所属栏目:大数据 来源:网络整理
导读:借用了网上的大数代码,小白上的高精度补全了。 代码: /*1.高精度加法2.高精度减法3.高精度乘法4.高精度除以低精度5.高精度对低精度的取余必要时可以将全局的long long替换成long long.除了main函数的返回值long long用到除法和取余的时候可能需要把全局的l

借用了网上的大数代码,小白上的高精度补全了。


代码:

/*
1.高精度加法
2.高精度减法
3.高精度乘法
4.高精度除以低精度
5.高精度对低精度的取余

必要时可以将全局的long long替换成long long.除了main函数的返回值long long
用到除法和取余的时候可能需要把全局的long long替换成long long
*/
#include <cstdio>
#include <iostream>
#include <cstring>
#include <climits>
#include <cassert>
using namespace std;

#define maxn 30000

struct bign
{
    long long len,s[maxn];

    bign()
    {
        memset(s,sizeof(s));
        len = 1;
    }

    bign(long long num)
    {
        *this = num;
    }

    bign(const char* num)
    {
        *this = num;
    }

    bign operator = (long long num)
    {
        char s[maxn];
        sprintf(s,"%d",num);
        *this = s;
        return *this;
    }

    bign operator = (const char* num)
    {
        len = strlen(num);
        for (long long i = 0; i < len; i++) s[i] = num[len-i-1] - '0';
        return *this;
    }

    string str() const
    {
        string res = "";
        for (long long i = 0; i < len; i++) res = (char)(s[i] + '0') + res;
        if (res == "") res = "0";
        return res;
    }

    /*去除前导0*/
    void clean()
    {
        while(len > 1 && !s[len-1]) len--;
    }

    /*高精度的加法*/
    bign operator + (const bign& b) const
    {
        bign c;
        c.len = 0;
        for (long long i = 0,g = 0; g || i < max(len,b.len); i++)
        {
            long long x = g;
            if (i < len) x += s[i];
            if (i < b.len) x += b.s[i];
            c.s[c.len++] = x % 10;
            g = x / 10;
        }
        return c;
    }

    /*高精度的减法*/
    bign operator - (const bign& b)
    {
        bign c;
        c.len = 0;
        for (long long i = 0,g = 0; i < len; i++)
        {
            long long x = s[i] - g;
            if (i < b.len) x -= b.s[i];
            if (x >= 0)
                g = 0;
            else
            {
                g = 1;
                x += 10;
            }
            c.s[c.len++] = x;
        }
        c.clean();
        return c;
    }

    /*高精度的乘法*/
    bign operator * (const bign& b)
    {
        bign c;
        c.len = len + b.len;
        for (long long i = 0; i < len; i++)
        for (long long j = 0; j < b.len; j++)
        c.s[i+j] += s[i] * b.s[j];
        for (long long i = 0; i < c.len-1; i++)
        {
            c.s[i+1] += c.s[i] / 10;
            c.s[i] %= 10;
        }
        c.clean();
        return c;
    }

    /*高精度除以低精度*/    /*用到除法和取余的时候可能需要把全局的int替换成long long*/
    bign operator / (long long b) const
    {
        assert(b > 0);
        bign c;c.len = len;
        for (long long i = len-1,g = 0; i >= 0; --i)
        {
            long long x = 10*g+s[i];    //这里可能会超过int 故用long long

            c.s[i] = x/b;                //这里可能会超过int

            g = x-c.s[i]*b;                //这里可能会超过int
        }
        c.clean();
        return c;
    }

    /*高精度对低精度取余*/    /*用到除法和取余的时候可能需要把全局的int替换成long long*/
    bign operator % (long long b)
    {
        assert(b > 0);
        bign d = b;
        bign c = *this-*this/b*d;
        return c;
    }

    bool operator < (const bign& b) const
    {
        if (len != b.len) return len < b.len;
        for (long long i = len-1; i >= 0; i--)
        if (s[i] != b.s[i]) return s[i] < b.s[i];
        return false;
    }

    bool operator > (const bign& b) const
    {
        return b < *this;
    }

    bool operator <= (const bign& b)
    {
        return !(b > *this);
    }

    bool operator >= (const bign& b)
    {
        return !(b < *this);
    }

    bool operator == (const bign& b)
    {
        return !(b < *this) && !(*this < b);
    }

    bool operator != (const bign& b)
    {
        return (b < *this) || (*this < b);
    }

    bign operator += (const bign& b)
    {
        *this = *this + b;
        return *this;
    }
};

istream& operator >> (istream &in,bign& x)
{
    string s;
    in >> s;
    x = s.c_str();
    return in;
}

ostream& operator << (ostream &out,const bign& x)
{
    out << x.str();
    return out;
}


int main()
{
    bign a;
    char b;
    long long c;
    while (cin >> a >> b >> c)
    {
        if (b == '/')
            cout << a/c << endl;
        else
            cout << a%c << endl;
    }
}


大数开方:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <climits>
#include <cassert>
using namespace std;
const int maxn = 1000 + 10;

struct bign
{
    int s[maxn];
    bign ()
    {
        memset(s,sizeof(s));
    }
    bign (int number)
    {
        *this = number;
    }
    bign (const char* number)
    {
        *this = number;
    }

    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 operator = (int num)
    {
        char str[maxn];
        sprintf(str,num);
        return *this = str;
    }

    bool 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;
    }
    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)
    {
        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;
        }

        while (sum)
        {
            ans.s[++ans.s[0]] = sum % 10;
            sum /= 10;
        }
        return ans;
    }

    bign operator * (const bign& c)
    {
        bign ans;
        for (int i = 1; i <= c.s[0]; i++)
        {
            int d = c.s[i],sum = 0;
            for (int j = 1; j <= s[0]; j++)
            {
                sum = d * s[j] + sum + ans.s[i + j - 1];
                ans.s[i + j - 1] = sum % 10;
                sum /= 10;
            }
            int t = s[0] + i - 1;

            while (sum)
            {
                ++t;
                sum += ans.s[t];
                ans.s[t] = sum % 10;
                sum /= 10;
            }
            ans.s[0] = max(ans.s[0],t);
        }
        return ans;
    }

    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] -= 1;
            }
            ans.s[i] -= c.s[i];
        }

        ans.del();
        return ans;
    }

    int operator / (const bign& c)
    {
        int ans = 0;
        bign d = *this;
        while (d >= c)
        {
            d = d - c;
            ans++;
        }
        return ans;
    }
    void put()
    {
        if (s[0] == 0)
            printf("0");
        else
            for (int i = s[0]; i; i--)
                printf("%d",s[i]);
    }

    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 del()
    {
        while (s[s[0]] == 0)
        {
            s[0]--;
            if (s[0] == 0) break;
        }
    }
};

void Sqrt(char *num)
{
    int len = strlen(num),i;
    bign ans = 0,b,c,d;
    if (len % 2)
    {
        i = 1;
        int cur = num[0] - '0';
        ans = (int)sqrt(cur);
        d = cur;
    }
    else
    {
        int cur = (num[0] - '0') * 10 + num[1] - '0';
        ans = (int)sqrt(cur);
        d = cur;
        i = 2;
    }

    if (i < len)
    {
        int cur = (num[i] - '0') * 10 + num[i + 1] - '0';
        i += 2;
        c = cur;
        d = d.mul(2) + c;

        c = ans * ans;
        c = d - c.mul(2);
        b = ans + ans;
        b.mul(1);

        cur = c / b;

        while (1)
        {
            bign t = cur * cur;
            b = ans * (20 * cur) + t;

            b.del();
            if (b <= c)
            {
                d = c - b;
                t = cur;
                ans = ans.mul(1) + t;
                break;
            }
            else if (cur)
            {
                cur--;
            }
            else
                break;
        }
    }

    while (i < len)
    {
        int cur = (num[i] - '0') * 10 + num[i + 1] - '0';
        i += 2;
        c = cur;
        d = d.mul(2) + c;

        b = ans + ans;
        b.mul(1);

        cur = d / b;

        while (1)
        {
            bign t = cur * cur;
            b = ans * (20 * cur) + t;

            b.del();
            if (b <= d)
            {
                d = d - b;
                t = cur;
                ans = ans.mul(1) + t;
                break;
            }
            else if (cur)
            {
                cur--;
            }
            else
                break;
        }
    }
    ans.put();
    printf("n");
}

int main ()
{
#ifdef LOCAL
    freopen("in.txt","r",stdin);
#endif
    int ncase;
    char num[maxn];
    scanf("%d",&ncase);
    while (ncase--)
    {
        scanf("%s",num);
        Sqrt(num);
        if (ncase)
            printf("n");
    }
    return 0;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读