2014-03-05 77 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,它非常快速且經過高度測試。