自守数是指一个n位自然数,其平方的后n位与该数相同的数;验证时应通过计算该数位数k,再用平方值对10ᵏ取模,判断结果是否等于原数,避免使用double型pow函数导致精度丢失,宜用循环或字符串长度获取位数并构造模数。

什么是自守数,以及怎么快速验证
自守数(Automorphic number)是指一个整数的平方以该数本身结尾。比如 5:5² = 25,末尾是 5;76:76² = 5776,末尾是 76。判断的关键不是算完整平方再字符串匹配,而是用模运算截取末尾——因为“末尾 n 位”等价于对 10ⁿ 取模。
用 pow(10, digit_count) 获取模数时的陷阱
C++ 标准库的 pow 返回 double,对大整数会丢失精度。比如 pow(10, 15) 可能变成 999999999999999.9 或 1000000000000000.1,转成整型后出错。必须手写幂函数或用循环构造模数:
- 对
n计算位数可用to_string(abs(n)).length()(注意负数要取绝对值) - 更稳妥的模数生成方式:
long long mod = 1; int d = to_string(abs(n)).length(); for (int i = 0; i
- 若
n是 0,单独处理:0² = 0,0 % 10 == 0 → 是自守数
平方后取模前要注意溢出
如果直接算 n * n 再取模,n 稍大(比如 10⁵)就会溢出 int 或 long。正确做法是边乘边模,利用恒等式:(a * b) % m == ((a % m) * (b % m)) % m:
- 用
long long存n和模数mod - 计算平方模:
long long sq_mod = ((n % mod) * (n % mod)) % mod;
- 比较
sq_mod == abs(n) % mod(注意符号:-25 % 100 在 C++ 中是 -25,所以统一用非负余数)
完整可运行的判断函数
把上面几点串起来,这个函数能安全处理到 ±10⁹ 范围内的整数:
bool isAutomorphic(int n) {
if (n == 0) return true;
int abs_n = abs(n);
int d = to_string(abs_n).length();
long long mod = 1;
for (int i = 0; i <p>真正容易被忽略的是负数的模行为和 <code>pow</code> 的精度问题——这两个点不处理,测试用例看着都过,一换数字就翻车。</p>C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











