我有两个整数x和y 假设x = 10 ^ 5且y = 10 ^ 8 现在我必须将数字相乘并将它们存储在变量z中。我不需要具有确切的价值。 z的答案模数为100000009.我该怎么做?
提前致谢
答案 0 :(得分:4)
一般来说,你应该依赖这种关系:
(a * b) % n = (a % n) * (b % n) % n
在这种特殊情况下,它没有多大帮助,因为a
和b
都小于n
,但对于较大的a
或b
这可以保证您需要处理的最大乘法大约为n^2
而不是a * b
。
在64位系统上,您当前的n^2
值适合long
。如果您预期更大的值,那么您将需要一个任意精度的数学库,如GMP。
答案 1 :(得分:0)
#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;
}
答案 2 :(得分:0)
您可以使用对数和指数。指数是函数f(x)= e ^ x,其中e是一个等于2.71828182845的数学常量... 对数(用ln标记)是指数的倒数。
由于ln(a * b)= ln(a)+ ln(b),a * b = e ^(ln(a)+ ln(b))。
备注:
这种方法在计算机之前就被使用了。