如何将 2 个大数相乘
how to multiply 2 large numbers?
我创建了一个小控制台应用程序,它将 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;
}
> 10^m 不是 10 的 m 次方,实际上这是 m 的 10 次幂
您可以使用 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;
然后而不是10^m
使用tenToM
而不是10^(2*m)
使用tenToTwoM
如果乘积小于或等于 10 ^ 18 ;您可以简单地使用
long long product = a * b ;
如果a或b大于长长的范围;可以简单地取一个一样长,另一个像字符串一样长。假设 a> 10^18 和 b <10^18 。下面的代码仅在 b * 9 在长 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 .
但是,如果两者都非常大,您可以考虑使用第三方大整数库。对于外部大整数库,您可以考虑使用BOOST大整数库,这是非常快速和经过高度测试的。
似乎您的问题出在 else 部分的逻辑中。 它最多可以工作 3 位数字,因为它只是在失败时输出产品,它会运行您的 else 块,我不确定我是否理解。设置m = n/2
到底想做什么?
相关文章:
- 没有找到相关文章