使用二维数组 C# 创建一个 table 矩阵

Create a table matrix with 2d arrays C#

我正在尝试创建一个程序,您可以在其中向用户询问一个数字,创建一个尽可能接近正方形的数组,并用 1 填充到用户指定的数字。您必须使用二维数组。这是它的外观示例:

用户输入:16

输出:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

我试过 运行 通过循环来做到这一点,但没有奏效,我希望有人能指导我如何做到这一点

首先让我们获取用户输入:

int num;
while(!int.TryParse(Console.ReadLine(), out num) || num < 1)
{
    Console.WriteLine("Invalid number!");
}

之后计算正方形的边:

var sideLength = (int)Math.Ceiling(Math.Sqrt(num));

然后创建二维数组:

var array = new int[sideLength, sideLength];

并将数字写入其中:

for (int row = 0; row < sideLength; row++)
{
    for (int column = 0; column < sideLength; column++)
    {
        var value = row * sideLength + (column + 1);
        if (value > num)
            break;
        array[row, column] = value;
    }
}

但是不要写任何高于用户输入的东西,这会让他们 0,这很好,因为你想从 1 显示它,所以你可以使用 0 检测结束以防用户输入不是平方数。

现在让我们准备一个字符串来格式化数字。如果您希望所有数字的长度完全相同,您可以将其格式化为 int.ToString("0"),其中 0 的数量将设置长度。让我们创建一个字符串,使所有数字的长度相同。用户输入的是最长的数字,因此您可以使用它来创建字符串:

var format = new string('0', num.ToString().Length);

现在打印数组:

for (int row = 0; row < sideLength; row++)
{
    for (int column = 0; column < sideLength; column++)
    {
        var value = array[row, column];
        if (value == 0)
        {
            Console.WriteLine("");
            goto breakBoth;
        }
        Console.Write($"{value.ToString(format)} ");
    }
    Console.WriteLine("");
}
breakBoth:

这会将相同数量的数字放在一行中,并且会有相同数量的行,除非它找到 0,然后它会停止并且最后一行不会是完整的行,如果输入不是平方数,就会发生这种情况。

让我们看看输出:

输入:16

输出:

01 02 03 04
05 06 07 08
09 10 11 12
13 14 15 16

输入:14

输出:

01 02 03 04
05 06 07 08
09 10 11 12
13 14

如果你想显示 0s 如果它不是一个完整的行,你可以从打印部分删除 0 检查。

这个可以优化吗?

是的!该数组是无用的,它只包含递增的数字。如果二维数组不是必需的,你可以完全删除它并对打印函数进行一些修改。

int num;
while(!int.TryParse(Console.ReadLine(), out num))
{
    Console.WriteLine("Invalid number!");
}


var sideLength = (int)Math.Ceiling(Math.Sqrt(num));
var format = new string('0', num.ToString().Length);
for (int row = 0; row < sideLength; row++)
{
    for (int column = 0; column < sideLength; column++)
    {
        var value = row * sideLength + (column + 1);
        if (value > num)
        {
            Console.WriteLine("");
            goto breakBoth;
        }
        Console.Write($"{value.ToString(format)} ");
    }
    Console.WriteLine("");
}
breakBoth:

此代码做同样的事情,但没有二维数组。