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)。