【问题标题】:how to multiply 2 large numbers?如何将两个大数相乘?
【发布时间】:2014-03-05 20:58:02
【问题描述】:

我创建了一个小型控制台应用程序,它乘以 2 个长整数。 我不知道我的问题在哪里。这个应用程序可以正常工作,直到位数为 3。

但如果位数大于 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;
}

【问题讨论】:

  • 任何错误结果的例子?
  • 如果位数更大 tahn 3 是的,我得到了错误的答案。例如,当 longMultiply(999,999) 我得到正确的答案时。但是当值是 longMultiply(1000*1000) 我得到错误的答案。

标签: c++ algorithm math


【解决方案1】:

10^m 不是 10 的 m 次方,实际上是 10 与 m 异或

您可以改用 cmath 库中的 pow 函数 (http://www.cplusplus.com/reference/cmath/pow/),但它适用于浮点数。

或者,要获得 10^m,您可以简单地将 1 m 乘以 10。

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

然后用tenToM代替10^m,用tenToTwoM代替10^(2*m)

【讨论】:

  • 我该如何解决它...?!
【解决方案2】:

如果乘积小于等于 10 ^ 18 ; 你可以简单地使用

  long long product = a * b ;

如果 a 或 b 大于 long long 的范围; 一个可以简单地用一个 long 和另一个 string 。 假设 a > 10^18 和 b

       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 .

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

【讨论】:

    【解决方案3】:

    看来您的问题出在 else 部分的逻辑上。它最多可以工作 3 位数,因为它只是在失败时输出产品,它运行你的 else 块,我不确定我是否理解。设置m = n/2到底是为了做什么?

    【讨论】:

    • n = max(digits(a),digits(b));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    相关资源
    最近更新 更多