一道c++题,关于很大的数求模。
编写函数int modulus(int x,int y,int m),实现求(x^y)mod m,并返回。(mod 即为求模运算,在c++中即%表示)。如 modulus(5,3,13),其返回结果是8。注意考虑多种方法,并对各种方法的执行时间进行比较,尤其是第二个参数很大时,如modulus(12345,123467424,31)。
数学基础:
(x+y)% n=(x% n+y% n)% n;
(x-y)% n=(x% n-y% n)% n;
(x*y)% n=(x% n*y% n)% n;
老师布置的作业题,我编的程序当数很小的能计算,但当数很大的时候不能正确计算,我问过老师是不是要用到递归,她告诉我不要想那么复杂,请各位帮我看下,用什么办法把这种modulus(12345,123467424,31)很大的数求模,她给的几个数学基础公式也不是很清楚怎样利用,也没有个明确的思路,请你们帮我看下,谢谢 c++ 函数 求模 超大的数 数学
[解决办法]
unsigned long modulus(unsigned int x,unsigned int y,unsigned int m)
{
if (x>m)
x=x % m;
unsigned long z=x;
for(unsigned int i=1;i<y;i++)
{
z=z*x;
if (z>=m)
z=z%m;
}
return z;
}
void CMyTestPrj2View::OnTest3Testmod()
{
int x=modulus(12345,123467424,31);//x=8
}
[解决办法]
int modulus(int nBaseNum, int nIndex, int nDivisor)
{
if (nIndex == 0)
return (1 % nDivisor);
int nModuleResult = 0;
int nModuleReturn = 0;
// 递归调用
nModuleResult = modulus(nBaseNum, --nIndex, nDivisor);
// 调用公式(x*y)% n=(x% n*y% n)% n;
// 当然,我理解%(求模运算)等同于除法运算 ==> (x * y) % n=((x % n) * (y % n)) % n;
nModuleReturn = ((nBaseNum % nDivisor) * nModuleResult) % nDivisor;
return nModuleReturn;
}
递归调用的缺点:数太大了内存会不够用。