2

intタイプまたはの変数を受け取り、sまたはsのlong配列を返すメソッドを作成します。各配列項目は3桁のグループです。例えば:intlong

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();
}

これは単純な整数演算です。最初にモジュロを取り、右端の小数を取得し、次に除算して、すでに追加した小数を破棄します。リストが逆になるのを避けるためにスタックを使用しました。

編集:コメントで長さを取得するためにログを使用することが提案されました。コードを少し短くすることもできますが、読むときの意図がはっきりしないため、私の意見ではより良いコードではありません。また、余分なMath関数呼び出しが原因で、パフォーマンスが低下する可能性があります。いずれかの方法; ここにあります:

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ごとにintに

それ以外の場合は、残りの1つまたは2つなどの残りを検索します

文字列の前から部分文字列の余り

次に、残りの部分を3ずつサブストリングします

于 2013-02-24T15:24:11.157 に答える
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>する必要がないように使用します。.NET 2.0 のみを必要とする同じ目的でReverse使用することもできます。Stack<int>

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 に答える
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 に答える