c语言利用递归算法给定整数x和n,求x的n次幂 mod 1003 Input 整数x和n。 1<=x,n<=1,000,000,0000 Output x^n mod 1003 Sample Input 2 10 Sample Output 21
时间: 2024-10-17 22:10:33 浏览: 12
在C语言中,我们可以使用递归算法结合快速幂(Fast Exponentiation)的思想来计算大整数的幂并取模1003。这个过程通常避免了直接递归导致栈溢出的问题,通过分治策略将指数不断缩小。
以下是递归函数的基本思路:
1. 定义一个递归函数pow_mod(x, n),输入为底数x和指数n。
2. 如果n为0,返回1,因为任何数的0次幂都是1,并且1003的乘法运算对结果取模无影响。
3. 如果n为正偶数,将x平方并除以1003(即x * x % 1003),然后递归计算(n / 2)次幂。
4. 如果n为奇数,先计算x的一半的n次幂,再将结果乘以x(即pow_mod(x, (n - 1) / 2) * x % 1003)。
5. 返回上述步骤的结果。
这是一个简单的伪代码示例:
```c
int pow_mod(int x, int n) {
if (n == 0) return 1;
int half_n = n >> 1; // 取n的一半,假设n为非负整数
int temp = pow_mod(x, half_n); // 计算half_n次幂
if (n % 2) { // 如果n是奇数
return (temp * x) % 1003; // 加上剩余的一半
} else {
return (temp * temp) % 1003; // 因为n是偶数,所以是平方
}
}
// 示例调用
int result = pow_mod(2, 10);
```
相关问题
算法实验:给定整数x和n,C语言用递归求x的n次幂 mod 1003
在C语言中,我们可以使用递归的方式来计算一个整数x的n次方,并对结果取模1003。下面是一个简单的递归函数示例:
```c
#include <stdio.h>
// 定义递归函数,计算x^n mod 1003
int powerMod(int x, int n, int modulo) {
if (n == 0) // 基本情况:0次幂等于1,对mod取余操作结果不变
return 1;
else if (n % 2 == 0) // 如果n是偶数,递归地将x平方并缩小n的一半
return (powerMod(x, n / 2, modulo) * powerMod(x, n / 2, modulo)) % modulo;
else // 如果n是奇数,先乘以x再递归地计算n-1次幂
return (x * powerMod(x, n - 1, modulo)) % modulo;
}
int main() {
int x = 2; // 要计算的底数
int n = 5; // 次幂
int modulo = 1003; // 取模值
printf("(%d)^%d mod 1003 = %d\n", x, n, powerMod(x, n, modulo));
return 0;
}
```
这个程序首先检查基本情况(n为0),然后处理奇数和偶数的情况。对于偶数n,它会将问题简化为求x^(n/2)两次的结果;对于奇数n,它先乘以x,然后再递归计算(n-1)次幂。
c语言利用递归算法解决问题给定整数x和n,求x的n次幂 mod 1003 Input 整数x和n。 1<=x,n<=1,000,000,0000 Output x^n mod 1003 Sample Input 2 10 Sample Output 21
在C语言中,可以使用递归算法结合快速幂(Fast Exponentiation)的方式来解决这个问题。快速幂是一种优化版的指数计算方法,当n较大时,通过分治策略将原问题转化为一系列较小规模的问题,大大减少了计算量。
以下是使用递归实现的C代码片段:
```c
long long fast_pow(int x, int n, int mod) {
if (n == 0) // 当n为0时,任何数的0次方都是1
return 1;
else if (n % 2 == 0) { // 如果n是偶数,先平方再除以2
long long half = fast_pow(x, n / 2, mod);
return (half * half) % mod;
} else { // 如果n是奇数,直接计算x的n次方
long long half = fast_pow(x, (n - 1) / 2, mod);
return (x * half * half) % mod;
}
}
int main() {
int x, n;
scanf("%d%d", &x, &n); // 输入x和n
printf("%lld\n", fast_pow(x, n, 1003)); // 输出x的n次幂对1003取余的结果
return 0;
}
```
这个函数首先检查基本情况(n为0),然后根据n的奇偶性递归地调用自身,每次都将n减半或除以2,直到n变为0。这样可以避免大量的乘法运算,因为只需要进行log2(n)次乘法操作。
阅读全文