卡普列加数是指满足特定条件的正整数n:n=1时特例视为卡普列加数;否则计算n²,将其十进制字符串在非端点处分割为两个正整数a和b(a>0且b>0),若a+b=n则n是卡普列加数。

什么是卡普列加数?先看定义再写代码
卡普列加数不是数学竞赛题,而是有明确定义的:对一个正整数 n,计算 n²,然后把平方结果从某一位中间“切一刀”(不能切在最左或最右,即左右两部分都必须非空),得到两个正整数 a 和 b(允许 b 以 '0' 开头,但数值上仍算作整数,比如 "023" 就是 23),若满足 a + b == n,且 a > 0、b > 0,则 n 是卡普列加数。
注意:不同资料对前导零处理略有差异,主流定义(OEIS A006886)允许右半部分含前导零,但左半部分不能为 "0"(即切割点不能靠左到使 a == 0);同时,n = 1 是特例——1² = 1,无法合法分割(只有一位),但按约定视为卡普列加数。
怎么切平方数?枚举所有合法分割点
对 n² 的字符串表示(如 n=45 → "2025"),长度为 len,合法切割位置有 len - 1 个:在第 1 位后、第 2 位后……直到第 len-1 位后。每种切法产生两个子串:left 和 right。
关键校验点:
-
left不能为空,且不能全为 '0'(即stoi(left)必须 > 0) -
right可以是 "0"、"00" 等,stoi(right)会自动转成 0,但此时b == 0不合法(要求b > 0)→ 所以right不能全为 '0' - 更稳妥做法:用
stoll转换,并检查转换后值是否 > 0
示例:n = 45,n² = 2025,字符串长度 4,尝试切点:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
"2|025" → a=2, b=25 → 2+25=27 ≠45<br>"20|25" → a=20, b=25 → 20+25=45 ✓<br>"202|5" → a=202, b=5 → 202+5=207 ≠45
C++ 实现时容易踩的坑
直接用 to_string(n * n) 得到平方字符串,但要注意:
-
n较大时(如接近INT_MAX),n * n会溢出int→ 必须用long long存平方值 -
stoi最多处理 32 位整数,而n²可能达 64 位 → 统一用stoll转换子串 - 字符串分割时,用
substr(0, i)和substr(i),其中i从 1 到s.length()-1(闭区间) - 别忘了特判
n == 1:直接返回 true
简短核心逻辑:
bool isKaprekar(long long n) {<br> if (n == 1) return true;<br> string s = to_string(n * n);<br> int len = s.length();<br> for (int i = 1; i string left = s.substr(0, i);<br> string right = s.substr(i);<br> long long a = stoll(left);<br> long long b = stoll(right);<br> if (a > 0 && b > 0 && a + b == n) return true;<br> }<br> return false;<br>}
为什么有些数被误判?检查你的右半部分是否含纯零
常见错误是忽略 "100" 这类平方数:比如 n = 10,n² = 100,字符串为 "100"。切法有:
-
"1|00"→a=1,b=0→ 不合法(b 必须 > 0) -
"10|0"→a=10,b=0→ 同样不合法
所以 10 不是卡普列加数——这点常被手算漏掉。真正卡普列加数小值有:1, 9, 45, 55, 99, 297… 验证时建议拿这几个跑一遍你的函数。
边界和语义细节比算法本身更耗时间:平方值类型、字符串切分索引、零值判定、特例处理,缺一不可。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










