我想创建一个程序,在这个程序中,你要求用户输入一个数字,创建一个尽可能接近正方形的数组,然后用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
s将设置长度。让我们创建一个字符串,它将使所有数字的长度相同。用户输入的是尽可能长的数字,所以你可以用它来创建字符串。
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
如果你想显示 0
的如果不是一整行,你可以把打印部分的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:
这段代码做了同样的事情,但没有二维数组。