C中的数字金字塔



练习:制作一个程序,读取一个小于 100 的自然数n,并绘制示例输出格式的金字塔,每个金字塔都有 n 行n= 11 的输出:

01
02 02
03 03 03
04 04 04 04
05 05 05 05 05
06 06 06 06 06 06 
07 07 07 07 07 07 07
08 08 08 08 08 08 08 08 
09 09 09 09 09 09 09 09 09 
10 10 10 10 10 10 10 10 10 10 
11 11 11 11 11 11 11 11 11 11 11 
01
01 02
01 02 03
01 02 03 04
01 02 03 04 05
01 02 03 04 05 06
01 02 03 04 05 06 07
01 02 03 04 05 06 07 08
01 02 03 04 05 06 07 08 09
01 02 03 04 05 06 07 08 09 10
01 02 03 04 05 06 07 08 09 10 11

法典:

#include <stdio.h>
int main()
{
int i, j,n;
scanf("%d",&n);
for(i = 0; i < n; i++)
{
for(j = 0; j <= i; j++)
{
if(i + 1 < 10)
printf("0%d ", i+1);
else if(i + 1 >= 10)
printf("%d ", i+1);
}
printf("n");
}
printf("n");
for(i = 0; i < n; i++)
{
for(j = 0; j <= i; j++)
{
if(j + 1 < 10)
printf("0%d ", j+1);
else if(j + 1 >= 10)
printf("%d ", j+1);
}
printf("n");
}
return 0;
}

我的代码从在线判断收到"演示错误",可能是因为每行的最后数字后面都有一个空格。

关于如何解决它的任何提示?

我知道我已经发布了类似的问题,但我认为我并不完全理解解决方案。

打印两个金字塔的更短版本:

#include <stdio.h>
void pyramid1(int n)
{
for(int i=1; i<=n; ++i) {
for(int j=0; j<i; ++j)
printf("%s%02d", j? " " : "", i);
printf("n");
}
}
void pyramid2(int n)
{
for(int i=1; i<=n; ++i) {
for(int j=1; j<=i; ++j)
printf("%s%02d", j>1? " " : "", j);
printf("n");
}
}

int main(void) {
int n;
scanf("%d",&n);
pyramid1(n);
printf("nn");
pyramid2(n);
return 0;
}

输出

(对于 n==5(

Success #stdin #stdout 0s 4336KB
01
02 02
03 03 03
04 04 04 04
05 05 05 05 05

01
01 02
01 02 03
01 02 03 04
01 02 03 04 05

避免尾随空格的一种方法是:

for (int i = 0; i < n; i++)
{
const char *pad = "";
for (int j = 0; j <= i; j++)
{
printf("%s%.2d", pad, i+1);
pad = " ";
}
putchar('n');
}

对于行中的第一个数字,pad为空,因此仅输出数字。 对于所有后续的,pad是一个空白;您在新数字之前得到一个空白输出。

我发现这种技术的微小变化非常有用。 例如,可以使用pad = "Data: ";然后pad = ", "生成逗号分隔的值列表:

Data: 01, 02, 03

(我还没有审查循环限制(i < nj <= i(是否正确;这是一个单独的讨论。

这是两种金字塔类型的解决方案

void pyr(int n, int type)
{
for(int row = 1; row <= n; row++)
for(int col = 1; col <= row; col++)
printf("%02d%c", type ? col : row , col == row ? 'n' : ' ');
}

int main()
{
pyr(11,0);
pyr(11,1);
}

你可以在这里自己玩:https://godbolt.org/z/oPv84T

不要在每次迭代中使用空格作为后缀,而是在第一次迭代的每次迭代中将空格用作前缀。

取而代之的是:

for(j = 0; j <= i; j++)
{
if(i + 1 < 10)
printf("0%d ", i+1);
else if(i + 1 >= 10)
printf("%d ", i+1);
}

应用使用前导空格的细微更改:

for(j = 0; j <= i; j++)
{
if (j != 0)
printf(" "); // print the leading space
if(i + 1 < 10)
printf("0%d", i+1);
else if(i + 1 >= 10)
printf("%d", i+1);
}

如果你想看起来很聪明:

for(j = 0; j <= i; j++)
{
int val = i+1;
const char* prefix1 = (j==0) ? "" : " ";
printf("%s%02d", prefix1, val);
}

最新更新