C 使用single for loop打印右对齐的#楼梯

C 使用single for loop打印右对齐的#楼梯,c,C,我想打印一个右对齐的单圈楼梯。 for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(i+j>=n-1) { printf("#"); } else { printf(" "); } } printf("\n"); } 我试图打印一个右对齐的楼梯。 我做到了。 但是我想用单循环打印相

我想打印一个右对齐的单圈楼梯。

for(i=0;i<n;i++)
{
    for(j=0;j<n;j++)
    {
        if(i+j>=n-1)
        {
          printf("#");
        }
        else
        {
          printf(" ");
        }
    }
    printf("\n");
}
我试图打印一个右对齐的楼梯。
我做到了。 但是我想用单循环打印相同的内容。

for(i=0;i<n;i++)
{
    for(j=0;j<n;j++)
    {
        if(i+j>=n-1)
        {
          printf("#");
        }
        else
        {
          printf(" ");
        }
    }
    printf("\n");
}

for(i=0;i长话短说:有很多方法可以做到这一点。下面是一些我不知道的方法

递归:

void print(int n, int j) {
    if (j < n) {
        for (int i = 0; i < n; i++) {
            putchar(i + j >= n - 1 ? '#' : ' ');
        }

        puts("");
        print(n, j + 1);
    }
}

int main() {
    print(10, 0);
    return 0;
}
循环到
n*n
并使用条件确定何时打印新行:

int main() {
    int i, j, n = 10;

    for (i = 0, j = 0; i <= n * n; i++) {
        putchar(j++ >= n - 1 ? '#' : ' ');

        if (i % n == 0) {
            puts("");
            j = i / n;
        }
    }

    return 0;
}

长话短说:有很多方法可以做到这一点。下面是一些我不知道的方法

递归:

void print(int n, int j) {
    if (j < n) {
        for (int i = 0; i < n; i++) {
            putchar(i + j >= n - 1 ? '#' : ' ');
        }

        puts("");
        print(n, j + 1);
    }
}

int main() {
    print(10, 0);
    return 0;
}
循环到
n*n
并使用条件确定何时打印新行:

int main() {
    int i, j, n = 10;

    for (i = 0, j = 0; i <= n * n; i++) {
        putchar(j++ >= n - 1 ? '#' : ' ');

        if (i % n == 0) {
            puts("");
            j = i / n;
        }
    }

    return 0;
}

只要
#
标记的字符串足够长(至少
n
),您就可以使用:

for (i = 0; i < n; i++)
    printf("%*.*s\n", n, i+1, "##########");
您可以尝试以下代码:

#include <stdio.h>

int main(void)
{
    int n = 10;

    for (int i = 0; i < n; i++)
        printf("%*.*s\n", n, i + 1, "##########");

    return 0;
}
#包括
内部主(空)
{
int n=10;
对于(int i=0;i
或:

#包括
#包括
内部主(空)
{
int n=10;
字符数据[n+1];
memset(数据“#”,n);
数据[n]='\0';
对于(int i=0;i
或:

#包括
#包括
#包括
内部主(空)
{
int n=10;
char*data=malloc(n+1);
memset(数据“#”,n);
数据[n]='\0';
对于(int i=0;i

后两个将处理大于
10
n
值,没有任何问题。如图所示,第一个不会(但它可以相当容易地处理
n
的中等值)。请注意,中间一个使用VLA(可变长度数组);这是C99的强制性功能,也是C11和C18的可选功能。最后一个功能应该检查
malloc()
是否成功。对于
n
的合理值,在这种情况下不太可能失败,但在更大的程序中,检查始终是可取的。

只要
标记的字符串足够长(其中至少有
n
),您可以使用:

for (i = 0; i < n; i++)
    printf("%*.*s\n", n, i+1, "##########");
您可以尝试以下代码:

#include <stdio.h>

int main(void)
{
    int n = 10;

    for (int i = 0; i < n; i++)
        printf("%*.*s\n", n, i + 1, "##########");

    return 0;
}
#包括
内部主(空)
{
int n=10;
对于(int i=0;i
或:

#包括
#包括
内部主(空)
{
int n=10;
字符数据[n+1];
memset(数据“#”,n);
数据[n]='\0';
对于(int i=0;i
或:

#包括
#包括
#包括
内部主(空)
{
int n=10;
char*data=malloc(n+1);
memset(数据“#”,n);
数据[n]='\0';
对于(int i=0;i

后两个将处理大于
10
n
值,没有任何问题。如图所示,第一个不会(但它可以相当容易地处理
n
的中等值)。请注意,中间一个使用VLA(可变长度数组);这是C99的强制性功能,也是C11和C18的可选功能。最后一个功能应该检查
malloc()
是否成功。对于
n
的合理值,在这种情况下不太可能失败,但在更大的程序中,检查总是可取的。

printf(%*c,n-i,#;
将其中一个循环替换为
goto
。建议花时间阅读——这是值得的(这将为你节省大量的时间)。跟进(同上)你会发现你的代码生成的形状在其他问题中被描述为金字塔,而且经常会提到马里奥。@Kamil Cuk建议的解决方案会生成一条斜线,上面有
#
标记,但不会填充下面的区域,这与你的双循环代码不同。不过,你可以使用
对于(i=0;i
将其中一个循环替换为
goto
。建议花时间阅读——这是值得的(这将为你节省大量的时间)。跟进(同上)你会发现你的代码生成的形状在其他问题中被描述为金字塔,而且经常会提到马里奥。@Kamil Cuk建议的解决方案会生成一条斜线,上面有
#
标记,但不会填充下面的区域,这与你的双循环代码不同。不过,你可以使用
对于(i=0;i
只要
n
长度不超过
标记的字符串,它就可以工作。如果需要,有一些方法可以解决。这确实有效。你能解释一下你的代码的Printf格式吗@jonathanleffler这些程序减少了时间复杂度和空间复杂度吗?不。打印楼梯的时间复杂度是一样的与您的一样,这已经是最优的:O(n^2)。这些程序是否降低了时间复杂度和空间复杂度?否。打印楼梯的时间复杂度与您的相同,这已经是最优的:O(n^2)。