数字を数字の配列で表しているとします。たとえば、682は[6,8,2]となります。
あなたは0から999までカウントしたい場合は、あなたが書くことができる:
for (int n[0] = 0; n[0] <= 9; ++n[0])
for (int n[1] = 0; n[1] <= 9; ++n[1])
for (int n[2] = 0; n[2] <= 9; ++n[2])
// Do something with three digit number n here
しかし、あなたは9999にカウントしたいときには、ループのために余分に必要です。
代わりに、数字に1を加算する手順を使用します。最後の桁をインクリメントします(オーバーフローした場合は前の桁に移動するなど)。最初の桁がオーバーフローするとループが完了します。これは任意の桁数の数字を処理します。
ループ変数に「1を加える」と同様の手順が必要です。
最終的な数字「a[g]
」をインクリメントします。オーバーフローした場合(つまり、2g-1
を超過する場合)、次に重要な「数字」(a[g-1]
)に移動し、繰り返します。数字を使ってこれを行うのと比べると少し複雑ですが、値オーバーフローとして配列を戻ってしまったので、オーバーフローした数字を新しいベース値(左の値に依存します)にリセットする必要があります。
次のC#コードは、両方のメソッドを実装し、配列をコンソールに出力します。
static void Print(int[] a, int n, ref int count)
{
++count;
Console.Write("{0} ", count);
for (int i = 0; i <= n; ++i)
{
Console.Write("{0} ", a[i]);
}
Console.WriteLine();
}
private static void InitialiseRight(int[] a, int startIndex, int g)
{
for (int i = startIndex; i <= g; ++i)
a[i] = a[i - 1] + 1;
}
static void Main(string[] args)
{
const int g = 5;
// Old method
int count = 0;
int[] a = new int[g + 1];
a[0] = 1;
for (a[1] = a[0] + 1; a[1] <= 2; ++a[1])
for (a[2] = a[1] + 1; a[2] <= 3; ++a[2])
for (a[3] = a[2] + 1; a[3] <= 5; ++a[3])
for (a[4] = a[3] + 1; a[4] <= 7; ++a[4])
for (a[5] = a[4] + 1; a[5] <= 9; ++a[5])
Print(a, g, ref count);
Console.WriteLine();
count = 0;
// New method
// Initialise array
a[0] = 1;
InitialiseRight(a, 1, g);
int index = g;
// Loop until all "digits" have overflowed
while (index != 0)
{
// Do processing here
Print(a, g, ref count);
// "Add one" to array
index = g;
bool carry = true;
while ((index > 0) && carry)
{
carry = false;
++a[index];
if (a[index] > 2 * index - 1)
{
--index;
carry = true;
}
}
// Re-initialise digits that overflowed.
if (index != g)
InitialiseRight(a, index + 1, g);
}
}
出典
2012-01-15 04:56:08
arx
C++、MATLAB、Mathematicaの3つの言語がありますが、どれを使用しようとしていますか? –
任意の言語を歓迎します。 –