使用 Modulo 而不是两个循环

Using Modulo instead of two loops

我是一般编程的新手,现在正在学习 C#。

我刚写了一个小程序,我必须以特定模式单步执行 int[]。格局如下:

因此我写了下面的循环:

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