zoukankan      html  css  js  c++  java
  • 高精度 加减乘

    #include<stdio.h>
    #include<algorithm>
    #include<vector>
    #include<iostream>
    #include<math.h>
    #include<string.h>
    using namespace std;
    
    const int MAXN = 2007;
    
    struct BigNum
    {///数值保存从0位开始
    
        int num[MAXN];///数值,逆序保存
        int op;///表示符号位,1表示正数,-1表示负数
        int size;///数的位数
    
        BigNum(){
            size=1, op=1;
            memset(num, false, sizeof(num));
        }
        void Cin()
        {
            char s[MAXN];
    
            scanf("%s", s);
            size = strlen(s);
    
            for(int i=0, k=size-1; i<size; i++)
            {
                if(s[i]=='-')
                {
                    k--;
                    op = -1;
                }
                else
                    num[k--] = s[i] - '0';
            }
    
            if(op == -1)
                size--;
        }
        bool operator <= (const BigNum &b)const
        {///去符号比较大小
            if(size > b.size)return false;
            if(size < b.size)return true;
    
            for(int i=size-1; i>=0; i--)
            {
                if(num[i] > b.num[i])return false;
                if(num[i] < b.num[i])return true;
            }
    
            return true;
        }
        void operator = (const BigNum &b)
        {
            size = b.size, op=b.op;
    
            for(int i=0; i<b.size; i++)
                num[i] = b.num[i];
        }
        void operator = (const int &b)
        {
            int x = b;
    
            if(x < 0)
            {
                op = -1;
                x = -x;
            }
    
            size = 0;
            do
            {
                num[size++] = x % 10;
                x /= 10;
            }
            while(x);
        }
        BigNum operator * (const BigNum &b)const
        {
            BigNum res;
    
            res.op = b.op * op;
            res.size = size + b.size - 1;
    
            for(int i=0; i<b.size; i++)
            for(int j=0; j<size; j++)
            {
                res.num[i+j] += num[j] * b.num[i];
            }
    
            res.CarryBit();
    
            return res;
        }
        BigNum operator * (const int &b)const
        {
            int x = b;
            BigNum res;
    
            res.size = size;
            if(x < 0)
            {
                res.op = res.op * -1;
                x = -x;
    
            }
    
            for(int i=0; i<size; i++)
            {
                res.num[i] = num[i] * x;
            }
    
            res.CarryBit();
    
            return res;
        }
        friend BigNum operator + (BigNum a, BigNum b)
        {
            BigNum res;
    
            if(a.op != b.op)
            {
                res = a - b;
                b.op = b.op * -1;
            }
            else
            {
                res.op = a.op;
                res.size = max(a.size, b.size);
    
                for(int i=0; i<res.size; i++)
                    res.num[i] = a.num[i] + b.num[i];
                res.CarryBit();
            }
    
            return res;
        }
        friend BigNum operator + (BigNum a, int b)
        {
            BigNum res;
            res = b;
    
            res = res + a;
    
            return res;
        }
        friend BigNum operator - (BigNum a, BigNum b)
        {///b值小,先比较在进行相减
            BigNum res;
    
            b.op = b.op * -1;
    
            if(a.op == b.op)
                res = a + b;
            else
            {
                if(a <= b)
                    swap(a, b);
    
                res.size = a.size;
                res.op = a.op;
    
                for(int i=0; i<res.size; i++)
                {
                    if(i < b.size)
                        res.num[i] = a.num[i] - b.num[i];
                    else
                        res.num[i] = a.num[i];
                }
                res.BorrowBit();
            }
            return res;
        }
        friend BigNum operator - (BigNum a, int b)
        {
            BigNum res;
            res = b;
    
            res = a - res;
    
            return res;
        }
        void CarryBit()
        {///进位,注意减法的时候进位结果需要是非负数
            for(int i=0; i<size; i++)
            {
                if(num[i] >= 10)
                {
                    if(i+1==size)
                    {
                        num[i+1] = 0;
                        size += 1;
                    }
                    num[i+1] += num[i]/10;
                    num[i] %= 10;
                }
            }
            while(size > 1 && !num[size-1])
                size--;
            if(size == 1 && !num[0])
                op = 1;
        }
        void BorrowBit()
        {
            for(int i=0; i<size; i++)
            {
                if(num[i] < 0)
                {
                    num[i] += 10;
                    num[i+1] -= 1;
                }
            }
    
            while(size > 1 && !num[size-1])
                size--;
    
            if(size == 1 && !num[0])
                op = 1;
        }
        void Out()
        {
            if(op == -1)
                printf("-");
            for(int i=size-1; i>=0; i--)
                printf("%d", num[i]);
            printf("
    ");
        }
    };
    
    int main()
    {
        BigNum a, b;
    
        a.Cin();
        b.Cin();
    
        a = a * b;
    
        a.Out();
    
        return 0;
    }
  • 相关阅读:
    C#作为服务器端 MATLAB作为客户端 二者之间进行通信
    解决Socket通信中,经常遇到的问题——数据粘包的两种方法
    将之前的通信代码,以winform界面的形式写出来
    winform窗体程序之picturebox控件
    Socket通信
    Redis 高级教程 Redis 分区(6)
    Redis 高级教程 Redis 管道传输(5)
    Redis 高级教程 Redis 客户端连接(4)
    Redis 高级教程 Redis 基准(3)
    Redis 高级教程 Redis 安全(2)
  • 原文地址:https://www.cnblogs.com/liuxin13/p/4864619.html
Copyright © 2011-2022 走看看