You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#荷兰国旗算法练习代码添加Console.ReadLine后仍无输出是什么原因

问题排查与修复

你代码存在4个核心问题,直接导致要么数组越界程序崩溃无输出,要么逻辑错误无法得到正确结果:

  • 索引越界问题:你初始化o = a.Length,数组长度为9时合法索引是0~8,后续执行a[o] = ...直接触发索引越界异常,程序未捕获异常直接终止,所以没有输出
  • 交换逻辑错误:你当前的交换代码是把a[i]的值赋值给目标位置后又直接写回a[i],完全没有完成两个位置值的交换,等于做了无用操作
  • 循环变量未正确推进:整个循环里没有写i的自增逻辑,符合条件的场景下i不会向后走,会直接陷入死循环
  • 三色分类逻辑缺失:荷兰国旗算法要求三类元素分别归类为「被3整除」「被7整除且不被3整除」「既不被3也不被7整除」,你当前的分支逻辑没有处理被7整除的中间类的场景,也没有对应控制i的推进规则
修正后代码
static void Main(string[] args)
{
    int[] a = { 14, 18, 6, 4, 7, 12, 3, 9, 11 };
    int left = 0; // 指向被3整除区域的下一个空位
    int right = a.Length - 1; // 指向既不被3也不被7整除区域的前一个空位,修复越界问题
    int i = 0;
    int temp;

    while (i <= right)
    {
        if (a[i] % 3 == 0)
        {
            // 交换i和left位置的元素,修复交换逻辑
            temp = a[i];
            a[i] = a[left];
            a[left] = temp;
            left++;
            i++; // 换过来的元素已经处理过,i向后走
        }
        else if (a[i] % 7 == 0)
        {
            // 属于中间类,直接向后走
            i++;
        }
        else
        {
            // 属于最右类,交换i和right位置的元素
            temp = a[i];
            a[i] = a[right];
            a[right] = temp;
            right--;
            // 这里i不增加,因为换过来的元素还没做判断
        }
    }

    for (int j = 0; j < a.Length; j++)
    {
        Console.WriteLine(a[j]);
    }
}

运行后输出顺序为:被3整除的元素在前,被7整除的元素在中间,剩余元素在最后,完全符合荷兰国旗算法的分类要求。

内容的提问来源于stack exchange,提问作者OneGuyFromDownTown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 20:48:04