在C / C ++中乘以两个大数

时间:2012-09-05 22:33:27

标签: c++ iostream bignum

我试图为此提出解决方案......两个大数字abchar[]char*表示,目标是将它们乘以第三个指针char* c

void multiply( const char* a, const char* b ){
    int len_a = strlen( a );
    int len_b = strlen( b );
    int* c = new int[ len_a + len_b];
    memset( c, 0, sizeof(int) * ( len_a + len_b ));

    for( int i = len_a - 1; i >= 0; i-- ){
        for( int j = len_b - 1; j >= 0; j-- ){
            c[ i + j + 1 ] += ( b[ j ] - '0') * ( a[ i ] - '0' );
        }
    }

    for( int i = len_a + len_b; i >= 0; i-- ){
        if( c[ i ] >= 10 ){
            c[ i - 1 ] += c[ i ] / 10;
            c[ i ] %= 10;
        }
    }

    cout << a << " * " << b << " = " << c << endl;
    delete[] c;
}

我写了上面的函数为我做这个操作......但是,当我使用输入时:

int main( void ){
    const char* a = "999";
    const char* b =  "99999";
    multiply( a, b );
    // I expect the answer to be 1 and 6
    // profit = 0.92
    return 0;
}

我得到了:

999 * 99999 = 0x100100080

为什么我得到内存地址而不是实际数字? 谢谢!

5 个答案:

答案 0 :(得分:3)

因为c是一个int指针,cout的流操作符如果传递了这样的指针就会打印一个内存地址。要获得所需的值,您需要取消引用指针,例如*c。您可能需要编写一个循环来打印整个“整数”字符串。

答案 1 :(得分:1)

cout << a << " * " << b << " = ";
    for( int i = 0; i < len_a + len_b; i++ ){
        cout << c[ i ];
    }

    cout << endl;

将产生预期的结果......

答案 2 :(得分:1)

你的逻辑是正确的。 只是一个快速提醒:当你创建一个整数指针并希望将它用作数组时,它指向“数组的第一个元素”,因此当你打印它时,你会看到数组c的第一个元素的地址,在你的情况下是“0x100100080”。

要打印存储在c中的数字(字符),您需要取消引用指针,即一个接一个地打印数组中的元素。或者,您也可以将数组转换为数字并立即打印。对于后者,请参阅:How to convert array of integers into an integer in C?。 要逐个打印字符,您可以替换

std::cout<<c; 

使用以下代码:

int n=strlen(c);
for(int i=0; i<n; i++) {
    std::cout<<c[i];
}

这将打印数字。

答案 3 :(得分:0)

std::ostream(其类型std::cout)没有专门针对int*的任何重载运算符,因此它会回退到void*重载,只会输出指针值以实现定义的方式。

此外,int*重载不可能确定指针指向一个数组,并且进一步确定这样一个数组有多少个元素。

答案 4 :(得分:0)

有(C ++ 14) 我们可以使用boost libarary ..

#include <iostream>
#include <boost/multiprecision/cpp_int.hpp>
namespace mp = boost::multiprecision;
int main()
{
  mp::cpp_int s1("12368123681263817263863821638126328136218362182");
  mp::cpp_int s2("345897937325785470923092923709887329092470423707534025");
  mp::cpp_int S=s1*s2;
  std::cout << S << '\n';
  }