获取包含 X 位数的最小和最大整数值
Get min and max integer value containing X number of digits
生成包含 x
位数的最低和最高整数值的最佳方法是什么?
例如:
x
= 1:最小值 = 0,最大值 = 9
x
= 2:最小值 = 10,最大值 = 99
x
= 3:最小值 = 100,最大值 = 999
x
= 4:最小值 = 1000,最大值 = 9999
我觉得这应该是一件非常容易完成的事情,但我正在努力理解它背后的数学原理。
这是我到目前为止生成的 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
生成包含 x
位数的最低和最高整数值的最佳方法是什么?
例如:
x
= 1:最小值 = 0,最大值 = 9x
= 2:最小值 = 10,最大值 = 99x
= 3:最小值 = 100,最大值 = 999x
= 4:最小值 = 1000,最大值 = 9999
我觉得这应该是一件非常容易完成的事情,但我正在努力理解它背后的数学原理。
这是我到目前为止生成的 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