C++:快速模块化指数
C++: fast modular exponentation
我是一名计算机科学专业的学生,我有一个问题,我必须使用快速模块化指数。
使用我制作的这段代码,校正器告诉我在某些情况下输出不正确,但不应该是错误的。
unsigned long long int pow(int a, int n, int M)
{
if(n==0)
return 1;
if(n==1)
return a;
unsigned long long tmp=pow(a, n/2, M)%M;
if(n%2==0)
return ((tmp)*(tmp))%M;
return ((tmp*tmp)*(a%M))%M;
}
相反,使用其他代码,我通过了所有测试用例。
unsigned long long int pow(int a, int n, int M)
{
if(n==0)
return 1;
if(n==1)
return a;
unsigned long long tmp;
if(n%2==0){
tmp=pow(a, n/2, M)%M;
return (tmp*tmp)%M;
}
tmp=pow(a, n-1, M)%M;
return (tmp*(a%M))%M;
}
所以我的问题是为什么第一个代码我没有通过所有测试用例?
首先,如果n == 1
,则返回值应为a % M
,而不是a
。其次,乘积(tmp * tmp) * (a % M)
可以溢出,应按((tmp * tmp) % M) * (a % M)
计算。
条件n == 1
不需要任何特殊处理,代码可以简化为:
unsigned long long int pow(unsigned int a, unsigned int n, unsigned int m) {
if (n == 0)
return 1;
auto tmp = pow(a, n / 2, m) % m;
tmp *= tmp;
if (n % 2)
tmp = (tmp % m) * (a % m);
return tmp % m;
}
相关文章:
- 为什么当我解模块化时,这个C++代代码"效率较低"?
- 电源功能模块化操作
- 如何为模块化应用程序实现C++插件系统
- Arduino 模块化编程与全局和设置
- C++:快速模块化指数
- 为 n 维系统实现模块化龙格-库塔四阶方法
- OpenSSL模块化最大数据类型大小的简单方法
- 模块化算术 - 竞争性编程
- 模块化菜单和矢量实例化
- 在C++模块化编程中,如何组装.cpp和.h文件
- 如何在C 中找到模块化乘法逆
- C :实施模块化指数
- 模块化功能背后的逻辑
- 使用模块化算法将积分器转换为数组时出现问题
- 如何为模块化项目正确创建 CMake 文件
- MFC最佳实践和模块化
- C++ 中大数的模块化乘法
- 模块化C++设计
- 模块化和灵活的编程
- 选择用于模块化开发的相互通信方法