在C ++中功耗非常大

时间:2013-12-23 16:40:00

标签: c++ string math

有人可以用一点时间,他能向我解释一下如何强化非常大的数字吗?我不是在这里谈论一个现成的解决方案,以及如何实现算法的唯一解释。理想情况下,它基于类std :: string。

@edit

我读过有关移位的内容,但是示例仅以列表的形式出现,我想要解释它是如何工作的。

2 个答案:

答案 0 :(得分:4)

您可以将大数字表示为某个基数中的数字序列,并分别表示数字的符号。要做算术,你只需要实现你在小学学到的算法来做加法,长乘法等。有一些更有效的算法(例如Karatsuba)用于做一些操作,但初始实现可以使用更简单的形式。

如果你真的必须使用std :: string,你可以使用第一个字符来存储符号('+'或' - '),然后使用ascii中的数字10。它效率不高,但它可能是一种简单的入门方式,它确实可以轻松打印数字。

答案 1 :(得分:3)

这是我在需要时快速写的东西(不记得什么时候)。它是:

  1. 越野车;
  2. 不完整;
  3. 每个数组元素任意使用3位数,但可以使用更多;
  4. 可以明显改进(欢迎任何评论^^)。
  5. 但是,我希望这会有所帮助。

    typedef long long int lli;
    
    class BigInt
    {
    public: // Methods
        BigInt(lli s) : m_nbElements(100)
        {
            m_number.resize(m_nbElements);
    
            for (lli i=0; i < m_nbElements; ++i)
            {
                m_number[i] = s%1000;
                s /= 1000;
            }
        }
    
        BigInt(const std::string &str) : m_nbElements(100)
        {
            m_number.resize(m_nbElements);
    
            size_t sizeStr = str.size();
            int i = str.size() - 1;
            int thousands = 0;
            for (; i >= 2; i -= 3, ++thousands)
            {
                std::string subStr = str.substr(i-2, 3);
                unsigned int value;
                std::istringstream(subStr) >> value;
                m_number[thousands] = value;
            }
    
            // Handle the "first" 1 or 2 digits
            if (i >= 0)
            {
                std::string subStr = str.substr(0, i+1);
                unsigned int value;
                std::istringstream(subStr) >> value;
                m_number[thousands] = value;
            }
        }
    
        BigInt operator*(lli s)
        {
            lli temp, remainder = 0;
            for (lli i=0; i < m_nbElements; ++i)
            {
                temp = m_number[i] * s + remainder;
                m_number[i] = temp % 1000;
                remainder = temp / 1000;
            }
    
            return (*this);
        }
    
        BigInt operator/(lli s)
        {
            lli temp, remainder = 0;
            for (int i=m_nbElements-1; i >= 0; --i)
            {
                temp = (m_number[i] + remainder) / s;
                remainder = (m_number[i] % s)*1000;
                m_number[i] = temp;
            }
    
            return (*this);
        }
    
        BigInt operator-(BigInt s)
        {
            lli temp;
            for (unsigned int i=0; i < m_nbElements; ++i)
            {
                temp = m_number[i] - s.m_number[i];
                if (temp < 0)
                {
                    --m_number[i+1];
                    temp += 1000;
                }
                m_number[i] = temp;
            }
    
            return (*this);
        }
    
        BigInt operator+(BigInt s)
        {
            lli temp, remainder = 0;
            for (lli i=0; i < m_nbElements; ++i)
            {
                temp = m_number[i] + s.m_number[i] + remainder;
                m_number[i] = temp % 1000;
                remainder = temp / 1000;
            }
    
            return (*this);
        }
    
        std::string ToString()
        {
            std::string result = "";
            bool significantDigitsFound = false;
            for (int i=m_nbElements-1; i >= 0 ; --i)
            {
                if (!significantDigitsFound)
                {
                    if (m_number[i] > 0)
                    {
                        std::ostringstream ss;
                        ss << m_number[i];
                        result = ss.str();
    
                        significantDigitsFound = true;
                    }
                }
                else
                {
                    std::ostringstream ss;
                    ss << std::setw(3) << std::setfill( '0' ) << m_number[i];
                    result += ss.str();
                }
            }
    
            if (result == "")
            {
                result = "0";
            }
    
            return result;
        }
    
    private: // Attributes
        int m_nbElements;
        std::vector<lli> m_number;
    };