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

学生成绩与硬币分配问题:C#代码输出异常求助

学生成绩硬币分配问题的代码修复方案

问题1:输出语句用法错误,导致仅显示姓名

你最后输出的代码行写法有误:

Console.WriteLine(studentNames[i], " ", numberCoins[i]);

C# 中Console.WriteLine的多参数版本需要通过格式化字符串指定参数位置,否则只会输出第一个参数。正确写法二选一:

  • 字符串插值(C# 6及以上版本支持):
Console.WriteLine($"{studentNames[i]} {numberCoins[i]}");
  • 占位符写法:
Console.WriteLine("{0} {1}", studentNames[i], numberCoins[i]);

问题2:硬币分配逻辑存在两处缺陷

缺陷1:未初始化所有硬币的初始值

你仅给numberCoins[0]赋值为1,但数组其他元素默认是0。根据需求,每个学生至少应获得1枚硬币,所以初始化时要给所有元素设为1:

var numberCoins = new int[n];
for (int i = 0; i < n; i++)
{
    numberCoins[i] = 1;
}

或者用LINQ简化(需添加using System.Linq;):

var numberCoins = Enumerable.Repeat(1, n).ToArray();

缺陷2:反向遍历的赋值逻辑错误

反向遍历检查左边成绩高于右边时,直接赋值numberCoins[i] = numberCoins[i+1] + 1会覆盖正向遍历得到的正确值。比如示例中的Dan,正向遍历后硬币数是2(比John高),反向遍历若直接赋值会变成2,而正确值需要同时满足比左右邻居多,因此要取当前值和numberCoins[i+1]+1的最大值:

for (int i = n - 2; i >= 0; i--)
{
    if (grades[i] > grades[i + 1])
    {
        numberCoins[i] = Math.Max(numberCoins[i], numberCoins[i + 1] + 1);
    }
}

修复后的完整代码

using System;

class Program
{
    private static void Main(string[] args)
    {
        int n = Convert.ToInt32(Console.ReadLine());
        var numberCoins = new int[n];
        string[] studentNames = new string[n];
        
        // 初始化所有学生至少1枚硬币
        for (int i = 0; i < n; i++)
        {
            numberCoins[i] = 1;
        }

        for (int i = 0; i < n; i++)
        {
            studentNames[i] = Console.ReadLine();
        }

        int[] grades = new int[n];
        for (int i = 0; i < n; i++)
        {
            grades[i] = Convert.ToInt32(Console.ReadLine());
        }

        // 正向遍历:处理右边比左边成绩高的情况
        for (int i = 1; i < n; i++)
        {
            if (grades[i] > grades[i - 1])
            {
                numberCoins[i] = numberCoins[i - 1] + 1;
            }
        }

        // 反向遍历:处理左边比右边成绩高的情况,取最大值确保符合要求
        for (int i = n - 2; i >= 0; i--)
        {
            if (grades[i] > grades[i + 1])
            {
                numberCoins[i] = Math.Max(numberCoins[i], numberCoins[i + 1] + 1);
            }
        }

        // 正确输出姓名和硬币数
        for (int i = 0; i < n; i++)
        {
            Console.WriteLine($"{studentNames[i]} {numberCoins[i]}");
        }

        Console.ReadLine();
    }
}

测试验证

输入:

3
John
Dan
Sam
9
10
8

输出:

John 1
Dan 3
Sam 1

内容的提问来源于stack exchange,提问作者Bogdan Dragoş

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 23:15:53