2014-03-05 44 views
1

我创建了一个小的控制台应用程序,它将乘以2的长整数。 我不知道我的问题在哪里。这个应用程序工作正常,直到数字位数是3.如何繁殖2个大数字?

但如果数字的数量大于3,应用程序的输出是错误的。 :(

请告诉我在哪里我的问题是,我解决它

这里是我的代码:

int digits (int n) 
{ 
    int counter = 0; 
    while (n > 0) 
    { 
     n/=10; 
     counter++; 
    } 
    return counter; 
} 

long longMultiply(long a, long b) 
{ 
    const int S = 3; 
    int w,x,y,z; 
    int n = max(digits(a),digits(b)); 

    if(a == 0 || b ==0) { 
     return 0; 
    } else if (n <= S) { 
     return a*b; 
    } else { 
     int m = (n/2); 

     //first number 
     x = a/(10^m); 
     y = a%(10^m); 

     //second number 
     w = b/(10^m); 
     z = b%(10^m); 

     return (longMultiply(x,w)*(10^(2*m)) + (longMultiply(x,z) + longMultiply(w,y)))*(10^m) + longMultiply(y,z) ; 

    } 
} 

int main() { 
    //digits(12345); 
    cout << longMultiply(100,100); 
    return 0; 
} 
+0

任何错误结果的例子? – hivert

+0

如果数字的数量是biger tahn 3是的,我得到了争辩的答案。例如,当longMultiply(999,999)我得到正确的anwser。但是当值是longMultiply(1000 * 1000)时,我得到错误的答案。 –

回答

7

10^m不是10的m次方,其实这是10 XOR运算由M

您可以使用从CMATH库,而不是(http://www.cplusplus.com/reference/cmath/pow/)的pow功能,但它适用于浮点数。

Altern atively得到10^M,你可以简单地用10

int m = (n/2); 
long tenToM = 1; 
for (int i=0; i<m; i++) 
    tenToM *= 10; 
long tenToTwoM = tenToM * tenToM; 

乘1米次,然后代替10^m使用tenToM和替代10^(2*m)使用tenToTwoM

+0

我该如何解决它...?! –

0

好像你的问题是在逻辑的其他部分。它最多可以处理3位数字,因为它只是在输出产品失败时运行您的else块,我不知道我是否理解。设置m = n/2究竟是试图做什么?

+0

n =最大(数字(a),数字(b)); –

0

如果产品小于或等于10^18; 你可以简单地使用

long long product = a * b ; 

如果a或b比长长的范围更大; 人们可以简单地把长一个和另一个作为字符串。 假设a> 10^18和b = 1038。 以下代码仅在b * 9处于long long范围内时才有效。

 string a ; long long b ; 
     cin >> a >> b ; 
     reverse (a.begin() , a.end()) ; 
     string prod ; 
     long long temp ,carry ; 
     temp = carry = 0 ; 
     for (i = 0 ; i < a.length() ; i++){ 
      temp = (a[i] - '0') * b + carry ; 
      prod += (temp % 10) + '0' ; 
      carry = temp/10 ; 
     } 

     while (carry != 0){ 
     prod += (carry % 10) + '0' ; 
     carry /= 10 ; 
     } 
     reverse (prod.begin() , prod.end()) ; 
     cout << prod ; // this string contains the required product . 

但是,如果两者都非常大,您可以考虑使用第三方大整数库。 对于external Big Integer Library,您可以考虑使用BOOST BigInteger Library,它非常快速且经过高度测试。