用于教学的C#暴力破解算法仅输出0,求助故障排查
解决C#时钟式暴力破解算法只输出0的问题
嘿,我完全懂你遇到的困扰——这种模拟时钟进位的逻辑看着简单,但很容易在进位处理或者循环逻辑上栽跟头。你说代码只输出0,大概率是进位逻辑没正确触发,或者根本没写循环来生成后续的组合,只停在了初始状态。
先给你理清楚核心逻辑的正确打开方式,再给你一个可运行的示例代码:
核心思路回顾
我们要实现的是类似时钟“秒-分-时”的进位机制:
- 从字符串的最后一位开始,逐个字符递增到字符数组的末尾
- 当某一位到达末尾时,重置为第一个字符,同时向前一位“进位”(即前一位递增)
- 重复这个过程,直到最高位也完成进位(比如从
000到ZZZ的所有组合都生成完毕)
修正后的完整代码
using System; class BruteForceCracker { static void Main() { // 自定义你的字符集,可以添加小写字母、符号等 char[] charSet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray(); // 设置要生成的密码长度,比如3位 int targetLength = 3; // 用索引数组记录每个位置当前使用的字符在charSet中的下标,初始全0(对应第一个组合"000") int[] currentIndices = new int[targetLength]; do { // 把索引数组转换成对应的字符串输出 string currentAttempt = new string(Array.ConvertAll(currentIndices, idx => charSet[idx])); Console.WriteLine(currentAttempt); // 执行进位逻辑:从最后一位开始处理 int currentPos = targetLength - 1; bool needCarry = true; while (needCarry && currentPos >= 0) { currentIndices[currentPos]++; if (currentIndices[currentPos] == charSet.Length) { // 当前位已经到字符集末尾,重置为0,继续向前进位 currentIndices[currentPos] = 0; currentPos--; } else { // 当前位不需要进位,停止进位流程 needCarry = false; } } // 当currentPos < 0时,说明最高位也完成了进位,所有组合生成完毕,退出循环 } while (currentIndices[0] < charSet.Length); } }
关键问题排查(针对你只输出0的情况)
你可以对照自己的代码检查这几点:
- 有没有循环生成组合?
如果只执行了一次输出,那自然只会打印初始的0(或者000)。上面的代码用do-while循环来持续生成下一个组合,直到所有可能性都遍历完。 - 进位逻辑是否正确?
很多人会忘记处理“连续进位”的情况(比如999要变成AAA),或者只处理了最后一位,没向前遍历进位。上面的while循环专门处理这种连锁进位。 - 是否正确将索引转为字符?
如果直接输出了currentIndices里的数值0,而不是对应charSet[0]的字符,那也会只看到0。要确保用索引去字符数组里取对应的字符再输出。
调试小技巧
可以在进位逻辑里加一行打印,看看索引数组的变化:
Console.WriteLine($"当前索引数组: {string.Join(",", currentIndices)}");
这样就能清楚看到每一步的进位是否正确触发,方便定位问题。
内容的提问来源于stack exchange,提问作者Eldar B.
相关产品推荐
相关产品推荐

