Codechef竞赛CCRR2021-CCRR002题 C++代码Wrong Answer问题分析
代码错误点梳理
- 浮点数精度引发的循环范围错位:
pow()函数返回值为双精度浮点数,受浮点数存储特性影响,计算10的整数次幂时可能出现微小误差(例如理论值100,实际计算结果为99.9999999,强转为整型后变为99),直接导致循环起止边界错误,要么漏算合法值,要么纳入长度不符的数字。 - 密码合法性筛选逻辑错误:题目要求密码每一位的取值范围都是1~9,不允许出现0。原代码仅判断数字最后一位是否为0,完全没有识别中间位的0值。例如长度为3的102、305这类包含0的非法密码,会因为最后一位非0被错误输出。
- 不符合题目要求的解题逻辑:题目明确要求通过递归方式生成所有合法密码,原代码采用全局遍历的暴力逻辑,即使运行结果偶发正常也无法通过判题系统的校验。
修正后的正确代码
#include<bits/stdc++.h> using namespace std; // 递归逐位拼接生成合法密码 void buildPwd(int currentPos, int targetLen, string pwd) { // 递归终止条件:当前密码长度达到目标值,直接输出 if (currentPos == targetLen) { cout << pwd << '\n'; return; } // 每一位仅取1~9的合法数字递归拼接 for (int num = 1; num <= 9; num++) { buildPwd(currentPos + 1, targetLen, pwd + to_string(num)); } } int main() { int T; cin >> T; while (T--) { int l; cin >> l; buildPwd(0, l, ""); } return 0; }
内容的提问来源于stack exchange,提问作者Anshul Sharma
相关产品推荐
相关产品推荐

