获取包含 X 位数的最小和最大整数值

Get min and max integer value containing X number of digits

生成包含 x 位数的最低和最高整数值的最佳方法是什么?

例如:

我觉得这应该是一件非常容易完成的事情,但我正在努力理解它背后的数学原理。

这是我到目前为止生成的 max 值 (based on this answer):

public static int MaxIntWithXDigits(this int x)
{
    if (x == 0) throw new ArgumentException(nameof(x), "An integer cannot contain zero digits.");

    try
    {
        return Convert.ToInt32(Math.Pow(10, x) -1);
    }
    catch 
    {
        throw new InvalidOperationException($"A number with {x} digits cannot be represented as an integer.");
    }
}

如果有人可以帮助生成 min 值或对上述代码提出改进建议,我将不胜感激。

编辑

我快到了 - 这似乎适用于所有情况,除了 x = 1(并且最小值预期为 0)

public static int MinIntWithXDigits(this int x)
{
    if (x == 0) throw new ArgumentException(nameof(x), "An integer cannot contain zero digits.");

    x -= 1;

    try
    {
        return Convert.ToInt32(Math.Pow(10, x));
    }
    catch
    {
        throw new InvalidOperationException($"A number with {x} digits cannot be represented as an integer.");
    }
}

Fox 任意 x>1,最小值为 10x-1。例如:

  • 如果x = 2, min=102-1 = 101 = 10
  • 如果x = 3, min=103-1 = 102 = 100
  • 如果x = 4, min=104-1 = 103 = 1000

对于 x=1,因为它是唯一一个不是后接一系列零的值,所以您需要特殊处理。

public static int MinIntWithXDigits(this int x)
{
    if (x == 0) 
    {
        throw new ArgumentException(nameof(x), "An integer cannot contain zero digits.");
    }

    if (x == 1) {
        return 0;
    }

    try
    {
        return Convert.ToInt32(Math.Pow(10, x - 1));
    }
    catch 
    {
        throw new InvalidOperationException($"A number with {x} digits cannot be represented as an integer.");
    }
}

旁注:
如果将结果限制为 positive 整数而不是 non-negative 整数,则一位数最小的整数将是 1,一般公式也适用于这种情况。

您可以尝试这样的操作:

// let's return min and max in one go as a value tuple
public static (int min, int max) MaxIntWithXDigits(this int x) {
  if (x <= 0 || x > 9)
    throw new ArgumentOutOfRangeException(nameof(x));

  int min = (int)Math.Pow(10, x - 1); 

  return (min == 1 ? 0 : min, min * 10 - 1); 
}

演示:

var result = Enumerable
  .Range(1, 9)
  .Select(x => $"{x} : {MaxIntWithXDigits(x).min} .. {MaxIntWithXDigits(x).max}"); 

Console.Write(string.Join(Environment.NewLine, result));

结果:

 1 : 0 .. 9
 2 : 10 .. 99
 3 : 100 .. 999
 4 : 1000 .. 9999
 5 : 10000 .. 99999
 6 : 100000 .. 999999
 7 : 1000000 .. 9999999
 8 : 10000000 .. 99999999
 9 : 100000000 .. 999999999