首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

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

2013-11-25 
一道c++题,关于很大的数求模。编写函数int modulus(int x,int y,int m),实现求(x^y)mod m,并返回。(mod 即为

一道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;
}


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

热点排行