Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.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++_Arrays_Class_Endianness_Multiplication - Fatal编程技术网

C++ 将表示为数组的整数相乘

C++ 将表示为数组的整数相乘,c++,arrays,class,endianness,multiplication,C++,Arrays,Class,Endianness,Multiplication,我试图构建一个类bigint,它表示数组中的大数字,但是我在创建一个将这个bigint与另一个bigint相乘的*=成员函数时遇到了问题。我知道已经有一些课程可以做到这一点,但我正在尝试建立自己的课程作为学习练习 biguint的数字存储在数组std::size\u t data[CAPACITY]中,最低有效位存储在data[0]中,最高有效位存储在data[CAPACITY-1]中(小端)。例如,如果容量=5,则12345将表示为数据[0]=5,数据[1]=4,数据[2]=3,数据[3]=2

我试图构建一个类bigint,它表示数组中的大数字,但是我在创建一个将这个bigint与另一个bigint相乘的
*=
成员函数时遇到了问题。我知道已经有一些课程可以做到这一点,但我正在尝试建立自己的课程作为学习练习

biguint的数字存储在数组
std::size\u t data[CAPACITY]
中,最低有效位存储在
data[0]
中,最高有效位存储在
data[CAPACITY-1]
中(小端)。例如,如果
容量=5
,则12345将表示为
数据[0]=5,数据[1]=4,数据[2]=3,数据[3]=2,数据[4]=1

我已经成功地构建了构造函数、加法函数、大小函数、
操作符函数和
[]
操作符函数。例如,下面的代码可以工作

int main()
{
    biguint b(423);
    biguint c(2363);
    b += c;
    cout << b << endl;
    cout << b.size() << endl;

    return 0;
}
关于乘法问题,这是我提出的最接近的函数。它可以正确地计算像400*2这样的大整数,但在像400*20这样的大整数时失败,因为它重写了
数据[i]

void bigint::operator *= (const bigint &n)
{
    int carryover = 0;
    for (size_t i=0; i < size(); ++i)
    {
        for (size_t j=0; j < n.size(); ++j)
        {
            std::cout << data[i] << "*" << n[j] << "=";
            data[i] *= n[j];
            std::cout << data[i] << std::endl;
        }
    }
}
我认为正确的方法是创建一个新的bigint,但当我尝试这样的操作时,我得到了一个错误,
赋值的左操作数需要左值:

  109
*  12
 ____
  218
+1090
_____
 1308
void bigint::operator *= (const biguint &n)
{
    int carryover = 0;
    bigint ans(0);
    for (size_t i=0; i < size(); ++i)
    {
        for (size_t j=0; j < n.size(); ++j)
        {
            ans[j] += data[i] * n[i];
            ans[j] += carryover;
            carryover = ans[j] / 10;
            ans[j] = ans[j] % 10;
        }
    }
}

我解决了这个问题,但速度慢,效率低。我只是把第一个数字加上第二个数字。我的语法有点奇怪,因为我还没有编写
或+++
运算符。我现在将坚持使用这个实现,因为它是我现在唯一可以工作的实现

void biguint::operator *= (const biguint &n)
{
    biguint temp(*this);
    biguint i(1);
    biguint one(1);

    while (i.compare(n) != 0)
    {
        *this += temp;
        i += one;
    }
}

我认为您应该先尝试重载
*
操作符
void bigint::operator += (const biguint &n)
{
    int carryover = 0;
    for (size_t i=0; i < CAPACITY; ++i)
    {
        data[i] += n[i];
        data[i] += carryover;
        carryover = data[i] / 10;
        data[i] = data[i] % 10;
    }
}
void biguint::operator *= (const biguint &n)
{
    biguint temp(*this);
    biguint i(1);
    biguint one(1);

    while (i.compare(n) != 0)
    {
        *this += temp;
        i += one;
    }
}