【发布时间】:2017-12-25 13:43:38
【问题描述】:
递归函数FastExp使用算法计算(a^n)(mod m):
- a^n = 1,如果 n=0;
- a^n = [a^(n/2)]^2,如果 n 是偶数;和
- a^n = a(a^[(n-1)/2])^2 如果 n 是奇数。
现在我确定算法是正确的,并且我完全遵循了它,但是当我尝试运行我的代码时出现了分段错误。这是我的代码 -
`#include <stdio.h>
/* function prototype */
int FastExp(int a, int n, int m);
/* There is no error in the main function */
int main()
{
int a, n, m;
printf("Enter three positive numbers a n m: ");
scanf("%d %d %d", &a, &n, &m);
printf("%d^%d(mod %d) is %d\n", a, n, m, FastExp (a, n, m));
return 0;
}
/*
* FastExp(a, 0, m) is 1.
* FastExp(a, 1, m) is a.
* x = FastExp(a, n/2, m)
* FastExp(a, n, m) is x2(mod m) if n is even
* FastExp(a, n, m) is x2a(mod m) if n is odd
*/
/* There is some error in this function */
int FastExp(int a, int n, int m)
{
int an;
if (n == 0)
{
an = 1;
return an;
}
//even
if (n % 2 == 0)
{
an = FastExp (a, n/2, m); // an = a^(n/2)
an = FastExp (an, 2, m); // an = [a^(n/2)]^2
return an;
}
// odd
if (n % 2 == 1)
{
an = FastExp (a, (n-1)/2, m); // an = a^[(n-1)/2]
an = FastExp (an, 2, m); // an = {a^[(n-1)/2]}^2
an = an*a;
return an;
}
return (an % m);
}
我猜它会陷入无限循环,但我不确定如何纠正这个问题。我犯了一些基本错误吗?谁能解释一下如何用最少的指令更改来纠正它?
【问题讨论】:
标签: c recursion infinite-loop