使用 Modulo 而不是两个循环
Using Modulo instead of two loops
我是一般编程的新手,现在正在学习 C#。
我刚写了一个小程序,我必须以特定模式单步执行 int[]。格局如下:
- 从数组的最后一个条目开始 (int i)
- 形成 i 和(如果可用)上面三个条目的总和(例如 i += i-1 ... i += i-3)
- 将 i 更改为 i -= 4(如果可用)
- 从第 2 步开始重复,直到 i = 0;
因此我写了下面的循环:
for (int i = intArray.Length - 1; i >= 0; i -= 4)
{
for (int a = 1; a <= 3; a++)
{
if (i - a >= 0)
{
intArray[i] += intArray[i - a];
intArray[i - a] = 0;
}
}
}
现在我的新任务是更改我的代码,在模运算的帮助下仅使用 1 个循环。我确实了解模运算的作用,但我不知道如何使用它来摆脱第二个循环。
也许有人给我解释一下?非常感谢您。
反向迭代数组使它变得有点复杂,但是你想用模数摆脱内循环可能是这样的:
var intArray = Enumerable.Range(1, 15).ToArray();
for (int i = 1; i < intArray.Length - 1; i ++)
{
intArray[i - (i % 4)] += intArray[i];
intArray[i] = 0;
}
在遍历数组时,我们的想法是使用模 4 运算来计算您将添加当前值的下一个索引。
这应该适用于任何数组长度:
for (int i = 0; i < intArray.Length; i++){
// we check how far away we are from next index which stores the sum
var offset = (intArray.Length - 1 - i) % 4;
if (offset == 0) continue;
intArray[i+offset] += intArray[i];
intArray[i] = 0;
}
我是一般编程的新手,现在正在学习 C#。
我刚写了一个小程序,我必须以特定模式单步执行 int[]。格局如下:
- 从数组的最后一个条目开始 (int i)
- 形成 i 和(如果可用)上面三个条目的总和(例如 i += i-1 ... i += i-3)
- 将 i 更改为 i -= 4(如果可用)
- 从第 2 步开始重复,直到 i = 0;
因此我写了下面的循环:
for (int i = intArray.Length - 1; i >= 0; i -= 4)
{
for (int a = 1; a <= 3; a++)
{
if (i - a >= 0)
{
intArray[i] += intArray[i - a];
intArray[i - a] = 0;
}
}
}
现在我的新任务是更改我的代码,在模运算的帮助下仅使用 1 个循环。我确实了解模运算的作用,但我不知道如何使用它来摆脱第二个循环。
也许有人给我解释一下?非常感谢您。
反向迭代数组使它变得有点复杂,但是你想用模数摆脱内循环可能是这样的:
var intArray = Enumerable.Range(1, 15).ToArray();
for (int i = 1; i < intArray.Length - 1; i ++)
{
intArray[i - (i % 4)] += intArray[i];
intArray[i] = 0;
}
在遍历数组时,我们的想法是使用模 4 运算来计算您将添加当前值的下一个索引。
这应该适用于任何数组长度:
for (int i = 0; i < intArray.Length; i++){
// we check how far away we are from next index which stores the sum
var offset = (intArray.Length - 1 - i) % 4;
if (offset == 0) continue;
intArray[i+offset] += intArray[i];
intArray[i] = 0;
}