[英]Multiply large numbers in c
我有两个整数x和y让我们说x = 10 ^ 5和y = 10 ^ 8现在我必须将数字相乘并将它们存储在变量z中。 我不需要确切的价值。 z可以取模100000009为模。我该怎么做?
提前致谢
通常,您应该依靠这种关系:
(a * b) % n = (a % n) * (b % n) % n
在这种特殊情况下,这并没有太大帮助,因为a
和b
都小于n
,但是对于较大的a
或b
这保证了您需要处理的最大乘法约为n^2
而不是a * b
。
在64位系统上,您当前的值n^2
将适合在long
。 如果期望更大的值,则需要一个任意精度的数学库,例如GMP 。
#include <iostream>
#include <cmath>
int main() {
typedef unsigned long long ull;
ull x = std::pow(10,5);
ull y = std::pow(10,8);
ull z = (x*y) % 100000009;
std::cout << z << std::endl;
}
您可以使用对数和指数。 指数是函数f(x)= e ^ x,其中e是等于2.71828182845的mathall常数...对数(用ln标记)是指数的倒数。
由于ln(a * b)= ln(a)+ ln(b),因此a * b = e ^(ln(a)+ ln(b))。
备注:
该方法在计算机之前被广泛使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.