标签:c arrays algorithm math integer-arithmetic
给我数字3和一个变量’n’,它可以高达1000000000000(十亿).我必须打印3 ^ n模100003的答案.我尝试了以下操作:
>我尝试使用功能std :: pow(3,n),但不适用于大指数(在处理过程中无法应用模数).
>我尝试实现自己的函数,该函数会将3提高到n,因此我可以在需要时应用模,但是当用非常大的数字进行测试时,这种方法被证明太慢了.
>最后,我尝试对数字’n’进行质因子分解,然后使用’n’因子(及其出现的次数)来建立答案,这似乎是我能想到的最佳方法(如果有的话)是正确的).问题是我要对已经是质数很大的人怎么办?
因此,这些就是我的想法,如果有人认为有更好的方法(或者我的方法之一是最佳方法),我将不胜感激.
解决方法:
利用模块化算术的特性
(a × b) modulo M == ((a module M) × (b modulo M)) modulo M
通过使用上述乘法规则
(a^n) modulo M
= (a × a × a × a ... × a) modulo M
= ((a module M) × (a modulo M) × (a modulo M) ... × (a modulo M)) modulo M
通过分治法计算结果.重复关系将是:
f(x, n) = 0 if n == 0
f(x, n) = (f(x, n / 2))^2 if n is even
f(x, n) = (f(x, n / 2))^2 * x if n is odd
这是C的实现:
int powerUtil(int base, int exp, int mod) {
if(exp == 0) return 1;
int ret = powerUtil(base, exp / 2, mod) % mod;
ret = 1LL * ret * ret % mod;
if(exp & 1) {
ret = 1LL * ret * base % mod;
}
return ret;
}
double power(int base, int exp, int mod) {
if(exp < 0) {
if(base == 0) return DBL_MAX; // undefined
return 1 / (double) powerUtil(base, -exp, mod);
}
return powerUtil(base, exp, mod);
}
标签:c,arrays,algorithm,math,integer-arithmetic 来源: https://codeday.me/bug/20191013/1909873.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。