2

我想创建一个方法,该方法采用类型变量intorlong并返回一个ints 或longs 数组,每个数组项是一组 3 位数字。例如:

int[] i = splitNumber(100000);
// Outputs { 100, 000 }

int[] j = splitNumber(12345);
// Outputs { 12, 345 }

int[] k = splitNumber(12345678);
// Outputs { 12, 345, 678 }
// Et cetera

我知道如何使用模运算符获得数字的最后n位,但我不知道如何获得n 位,这是我能想到的唯一方法。请帮忙!

4

6 回答 6

5

不转换为字符串:

int[] splitNumber(int value)
{ 
    Stack<int> q = new Stack<int>();
    do 
    {
        q.Push(value%1000);
        value /= 1000;
    } while (value>0);
    return q.ToArray();
}

这是简单的整数运算;首先取模以获得最右边的小数,然后除以丢弃您已经添加的小数。我使用堆栈来避免反转列表。

编辑:评论中建议使用日志来获取长度。它可以使代码稍微一些,但在我看来它并不是更好的代码,因为阅读它时意图不太清楚。此外,由于额外的数学函数调用,它可能会降低性能。无论如何; 这里是:

int[] splitNumber(int value)
{
    int length = (int) (1 + Math.Log(value, 1000));
    var result = from n in Enumerable.Range(1,length)
                 select ((int)(value / Math.Pow(1000,length-n))) % 1000;
    return result.ToArray();           
}
于 2013-02-24T15:25:32.410 回答
4

尝试先将其转换为字符串并进行解析,然后再次将其转换回数字

于 2013-02-24T15:20:07.133 回答
4

通过转换为字符串然后转换为 int 数组

int number = 1000000;
string parts = number.ToString("N0", new NumberFormatInfo()
                                            {
                                                NumberGroupSizes = new[] { 3 },
                                                NumberGroupSeparator = "."
                                            });

通过使用数学,

public static int[] splitNumberIntoGroupOfDigits(int number)
{
    var numberOfDigits = Math.Floor(Math.Log10(number) + 1); // compute number of digits

    var intArray = new int[Convert.ToInt32(numberOfDigits / 3)]; // we know the size of array
    var lastIndex = intArray.Length -1; // start filling array from the end

    while (number != 0)
    {
        var lastSet = number % 1000;
        number = number / 1000;

        if (lastSet == 0)
        {
            intArray[lastIndex] = 0;  // set of zeros
            --lastIndex;                    
        }
        else if (number == 0)
        {
            intArray[lastIndex] = lastSet; // this could be your last set
            --lastIndex;                    
        }
        else
        {
            intArray[lastIndex] = lastSet;
            --lastIndex;                    
        }
    }

    return intArray;
}
于 2013-02-24T15:27:20.380 回答
1

转换为字符串

获取长度

如果长度模数 3 == 0

每 3 次将其字符串子串成整数

else if 查找余数,例如剩下的一两个

字符串前面的子字符串余数

然后以 3 为其余的子串

于 2013-02-24T15:24:11.157 回答
1

您可以先找出数字有多大,然后使用除法获取第一个数字,并使用模数保留其余数字:

int number = 12345678;

int len = 1;
int div = 1;
while (number >= div * 1000) {
  len++;
  div *= 1000;
}

int[] result = new int[len];
for (int i = 0; i < result.Length; i++) {
  result[i] = number / div;
  number %= div;
  div /= 1000;
}
于 2013-02-24T15:27:04.460 回答
1

您可以将其与System.Linq.NET 3.5 及更高版本的命名空间一起使用:

int[] splitNumber(long value)
{
    LinkedList<int> results = new LinkedList<int>();

    do
    {
        int current = (int) (value % 1000);

        results.AddFirst(current);
        value /= 1000;
    } while (value > 0);

    return results.ToArray();// Extension method
}

我过去常常LinkedList<int>避免Reverse在返回之前列出清单。您也可以Stack<int>用于相同的目的,只需要 .NET 2.0:

int[] splitNumber(long value)
{
    Stack<int> results = new Stack<int>();

    do
    {
        int current = (int) (value % 1000);

        results.Push(current);
        value /= 1000;
    } while (value > 0);

    return results.ToArray();
}
于 2013-02-24T15:28:55.797 回答