上面的算法有bug,更正一下:
public static int GetMin(UInt64 n)
{
if (n < 1000)
{
return (int)n;
}
int[] numbers = new int[20];
int i = 0;
//把所有的数字记录在一个20个元素的数组里
//并记下第一个开始填充数字的位置
//比如输入一个15位数,因为数组是定长的20位,那就从第6个元素开始是数字的头一位
for (i = 19; i >= 0; i--)
{
numbers[i] = (int)(n % 10);
n /= 10;
if (n == 0)
{
break;
}
}
int retVal = 0;
int selected = 0;
//比较的思路:
//比如第一个数字是5,那么检查后面有没有比5小的。
//如果有,然后检查该数字后面还有几个数字,如果够组成4位数,就不选择该数字
for (int j = i; j < 20; j++)
{
int toSelect = 1;
//如果后面的数字有比当前数字小,并且已选的数字加上从该数字开始剩下的数字还够构成一个4位数
//就不选择该数字
for (int k = j+1; k < 20; k++)
{
if (numbers[k] < numbers[j])
{
if ( 20-k >= 4 - selected)
{
toSelect = 0;
}
}
}
//如果后面更小的数字加上已选的数字不够组成一个四位数,就必须选择当前数字
//反之则不需要选择当前数字
if (toSelect == 1)
{
retVal *= 10;
retVal += numbers[j];
selected++;
}
else
{
Console.Write(numbers[j]);
if (j < 19) Console.Write(",");
}
if (selected >= 4) break;
}
return retVal;
}