题目解析
* 输入输出:第一行输入正整数 MMM 表示待判断数字个数;接下来 MMM 行每行一个正整数。对每个数输出单独一行,若为自幂数输出 T,否则输出 F。
* 数据范围:1≤M≤1001 \leq M \leq 1001≤M≤100,所有正整数均小于 10810^8108(即最多 8 位数)。单个数字的幂次和最大为 8×98≈3.4×1088 \times 9^8 \approx 3.4 \times 10^88×98≈3.4×108,在 32 位整型范围内。
* 复杂度要求:时间复杂度 O(M⋅d)O(M \cdot d)O(M⋅d),其中 d≤8d \leq 8d≤8 为数字位数;空间复杂度 O(1)O(1)O(1) 或 O(d)O(d)O(d)(字符串存储)。
* 算法知识点:数位分解、字符串处理、模拟、快速幂/幂运算
思路解析
1. 获取位数与分解数字:利用 to_string() 将整数转为字符串,字符串长度即为位数 NNN。通过遍历字符数组,将每个字符 s[i]s[i]s[i] 减去 '0' 即可得到对应位的数字值,避免了繁琐的取模除法运算。
2. 计算幂次和:遍历每一位数字,计算其 NNN 次方并累加。代码中使用 pow(num, n) 实现幂运算(注意该函数返回 double,在此数据范围内精度足够且结果可安全转换为整型)。
3. 自幂数判定:比较计算得到的幂次和与原数值,相等则为自幂数,输出 T;否则输出 F。
完整代码