嵌套循环和模数 c++

Nested loops and modulus c++

我正在学习 C++,但我的程序有问题。如果 n=11:

它应该打印出以下内容
*---------*
-*-------*-
--*-----*--
---*---*---
----*-*----
-----*-----
----*-*----
---*---*---
--*-----*--
-*-------*-
*---------*

这是我的代码,适用于 n=5,但不适用于更大的数字:

#include <iostream>
using namespace std;

int main ()
{
    int n;

    cout << "Enter size (n x n): " << endl;
    cin >> n;

    for (int i=0;i<n;i++){
        for (int j=0;j<n;j++){
            if (i%n==j%n) cout << '*';
            else if (i%(n-i)==j%(n-j)) cout << '*';
            else cout << '-';
        }
        cout << endl;
    }
    return 0;
}

如果 n=11:

*---------*
-*----*--*-
--*-----*--
---*---*---
----*------
-----*-----
-*----*--*-
---*---*---
--*-----*--
-*----*--*-
*---------*

我看到我已经成功编写了如何打印出“*”诊断之一。但是有些东西不能与另一个东西一起工作,这是倒退的。 不幸的是,我无法解决这个问题,需要您的建议。我究竟做错了什么?如何调试此类问题?

这个问题调试起来真的很简单

先看看第一个错误的*。出现在i=1j=6的位置。使用 n=11,您的条件 i%(n-i)==j%(n-j) 变为 1%(11-1) == 6%(11-6),这实际上是真的,因为表达式在两边的计算结果都是 1

这个表情背后是什么?为什么要用这种if来判断单元格是否属于第二条对角线呢?尝试写下应该打印在第二个对角线上的每一对 i, j,您应该会注意到一个更简单的模式。

P.S。在表达式 if (i%n==j%n) 中,您不必对操作数取模 n,因为它们都小于 n,因此它是多余的,可以简单地重写为 if (i == j) ].