2012-09-05 28 views
1

我试图想出解决方案...两个大数字abchar[]char*表示,目标是将它们乘以第三个指针, char* c在C/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 

为什么我会得到的内存地址,而不是实际的数量? 谢谢!

+0

'INT * C',当你输出,它将输出的指针。你不是想要做'char * c'吗? –

+1

噢,诡异地 - 旧的“我喜欢内存泄漏,双重删除和缓冲区溢出”的代码风格。 – Puppy

+0

@BobFincheimer:是的,我想把它作为'char * c'来完成。你能否给我一个想法,我怎么能把它写成char? – cybertextron

回答

3

c因为是int指针和如果通过这样的指针为COUT流操作者将打印的存储器地址。为了得到你需要用例如*c。您可能需要编写一个循环来打印整个“字符串”。

+0

但他使用c就像'char *',再次看,我认为他的意思是让c是char *而不是int *' –

+0

他使用int *,因为这是他积累中间乘法结果的地方。如果他使用char *,它会溢出。 – Barmar

+1

猜测他正在使用'int'以某种方式获得结果的空间,但也许你是对的。他确实说他想要一个char *'结果,但是他的函数实际上只是让'c'超出了范围并返回'void',所以很难说。 – smocking

0

std::ostream(其类型std::cout是)不具有任何重载操作专门针对int*,从而它落在回void*过载,其简单地输出在一个实现定义的方式将指针值。

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

+0

我怎么会为'char *'做这个操作呢? – cybertextron

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

    cout << endl; 

将产生期望的结果...

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]; 
} 

这将打印的数量。

0

为(C++ 14) 我们可以使用升压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'; 
    }