Online Compiler C

#include <stdio.h> #include <string.h> int main() { int a, b; if (scanf("%d %d", &a, &b) != 2) return 0; // 1. 处理特殊情况 0 if (a == 0) { printf("0\n"); return 0; } // 2. 处理正负号 int sign = 1; // 1代表正数,-1代表负数 if (a < 0) { if (b % 2 != 0) { sign = -1; // 负数的奇数次方是负数 } a = -a; // 取绝对值方便后续乘法计算 } // 3. 用数组模拟大数乘法,初始化为 1 int res[100] = {0}; res[0] = 1; int len = 1; // 当前数字的长度 // 循环乘 b 次 for (int i = 0; i < b; i++) { int carry = 0; // 进位 for (int j = 0; j < len; j++) { int prod = res[j] * a + carry; res[j] = prod % 10; // 当前位 carry = prod / 10; // 进位 } // 处理剩下的进位 while (carry > 0) { res[len] = carry % 10; carry /= 10; len++; } } // 4. 开始输出结果 // 如果结果是负数,先打印负号 if (sign == -1) { printf("-"); } // 从最高位开始倒着打印数组 for (int i = len - 1; i >= 0; i--) { printf("%d", res[i]); } printf("\n"); return 0; }
这段代码实现了一个大数幂运算,计算 a 的 b 次方。它用数组模拟了十进制乘法,可以处理非常大的结果(最多100位)。代码先处理了符号和零的特殊情况,然后通过循环 b 次逐位相乘来计算结果。

- 当 a 为负数且 b 为偶数时,结果应为正数,但你的代码只处理了奇数次方为负的情况。检查一下符号判断逻辑,看看偶数次方时符号应该是什么。
- 数组 res 初始化为 {0} 但第一位置为 1,这没问题。不过如果 b 为 0,你的代码会直接跳过循环,但前面没有处理 b=0 的情况(任何非零数的 0 次方应为 1)。考虑一下是否需要添加这个边界条件。