我被困在一个简单的问题上。 我得到3个大数(A,B,C),所有整数,我需要执行以下操作:从A到B并用C对结果进行模数,然后检查结果是否等于1.这是我的代码:< / p>
double power = fmod((pow((double)A,(double)B)),(double)C);
if (power != 1){
printf("Something!\n");
}
并且它不起作用(我试过小数字,比如17由28驱动并由29模块化)。有什么建议吗?
答案 0 :(得分:0)
试试这个(为了避免算术溢出):
unsigned long long power = 1;
A %= C;
while (B > 0)
{
power = (power * A) % C;
B--;
}
您可以使用以下方法进一步提高运行时性能:
unsigned long long power = 1;
A %= C;
while (B > 0)
{
if (B & 1)
power = (power * A) % C;
B >>= 1;
A = (A * A) % C;
}
答案 1 :(得分:-1)
尝试这种方法
double a,b,c;
a = 1124124124254234;
b = 1124124124254234 * 5;
c = 1124124124254234 * 2;
double power = pow(a,b);
double mod = fmod(power, c);
if (mod != 1){
printf("Something!\n");
}
答案 2 :(得分:-1)
Double的最小和最大尺寸分别为-1.7 * 10 ^ 308和1.7 * 10 ^ 308。如果你需要更大,你可以尝试很长时间。
不确定为什么要使用fmod。但这应该做你想要的。
double power = ( pow(A, B) ) % C;
if (power != 1){
printf("Something!\n");
}