Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的幂非常大+;_C++_String_Math - Fatal编程技术网

C++ C+中的幂非常大+;

C++ C+中的幂非常大+;,c++,string,math,C++,String,Math,有没有人能给我一点时间,他能向我解释一下,有多大的数字?我这里不是说一个现成的解决方案,也不是对如何实现算法的唯一解释。理想情况下,它基于类std::string @编辑 我读了一些关于移位位的内容,但是示例只是以列表的形式出现的,我想解释一下它是如何工作的。您可以将一个大数字表示为某个基数中的一系列数字,并分别表示数字的符号。要做算术,你只需实现你在小学学过的算法,做加法、长乘法等。有更有效的算法(例如Karatsuba)做一些运算,但最初的实现可以使用更简单的形式 如果确实必须使用std::

有没有人能给我一点时间,他能向我解释一下,有多大的数字?我这里不是说一个现成的解决方案,也不是对如何实现算法的唯一解释。理想情况下,它基于类std::string

@编辑


我读了一些关于移位位的内容,但是示例只是以列表的形式出现的,我想解释一下它是如何工作的。

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


如果确实必须使用std::string,则可以使用第一个字符存储符号(“+”或“-”),然后使用ascii存储以10为底的数字。虽然效率不高,但这可能是一种简单的开始方式,而且它确实使打印数字变得容易。

以下是我在需要时(不记得什么时候)快速编写的内容。它是:

  • 马车
  • 不完整
  • 每个数组元素可以任意使用3位数字,但可以使用更多
  • 可以明显改进(欢迎任何类型的评论^^)
  • 不过,我希望这会有所帮助

    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;
    };
    
    typedef long long int lli;
    类BigInt
    {
    公共方法
    BigInt(lli s):m_n元素(100)
    {
    m_编号。调整大小(m_元素);
    对于(lli i=0;i=2;i-=3,++1000)
    {
    std::string subStr=str.subStr(i-2,3);
    无符号整数值;
    std::istringstream(subStr)>>值;
    m_数【千】=数值;
    }
    //处理“第一个”1或2位数字
    如果(i>=0)
    {
    std::string subStr=str.subStr(0,i+1);
    无符号整数值;
    std::istringstream(subStr)>>值;
    m_数【千】=数值;
    }
    }
    BigInt运算符*(lli s)
    {
    lli温度,余数=0;
    对于(lli i=0;i=0;--i)
    {
    温度=(m_编号[i]+余数)/s;
    余数=(m_数[i]%s)*1000;
    m_编号[i]=温度;
    }
    返回(*本条);
    }
    BigInt运算符-(BigInt s)
    {
    lli温度;
    for(无符号整数i=0;i=0;--i)
    {
    如果(!找到有效数字)
    {
    如果(m_编号[i]>0)
    {
    std::ostringstream ss;
    
    ss搜索大整数库。然而,实际上没有解决方案将基于std::string,因为这是低效的。编写您自己的,或将每个数字字符串化。您必须将数字声明为数组…数组的每个元素指向一位数字如果您正计划实现我们自己的(你可能会发疯,因为已经有很多实现了)我鼓励你对你的数据类型使用一个常规的定标器向量,并编写转换器来转换到
    std::string
    。当你不需要经常做
    ,你会发现数学部分更容易合并(arg[n]-“0”)
    用于每个数据。生成的代码将更易于维护。使用
    std::string
    您可以完全按照在学校学到的方法进行算术运算。一次一位数。除法是最难的,但在计算幂时不需要除法。这是学习bignum算术(以及解释器如何工作)的一种非常愉快的方式是从emptyspace学习Scheme 9。这本书不是免费的,但很便宜。请看。它很有趣。bignum实现牺牲了一点速度来实现非常简洁、易懂的实现。当您理解这一点时,像
    gnump
    这样更复杂的包将更容易找到。