读书人

一道c++题关于很大的数求模。解决方

发布时间: 2013-11-25 13:22:27 作者: rapoo

一道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++题,关于很大的数求模。解决方法 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;
}


递归调用的缺点:数太大了内存会不够用。

读书人网 >C++

热点推荐