-3

我想像直角三角形一样打印这种图案

0   
909   
89098   
7890987    
678909876   
56789098765   
4567890987654   
345678909876543   
23456789098765432   
1234567890987654321 

我写了以下代码:


    #include <stdio.h>
    #include <conio.h>

    void main()
    {
        clrscr();
        int i,j,x,z,k,f=1;

        for ( i=10;i>=1;i--,f++)
        {
            for(j=1;j<=f;j++,k--)
            {
                k=i;

                if(k!=10)
                {
                    printf("%d",k);
                }

                if(k==10)
                {
                    printf("0");
                }

            }

            for(x=1;x<f;x++,z--)
            {
                z=9;
                printf("%d",z);
            }

            printf("%d/n");
        }

        getch();
    }

这段代码有什么问题?当我手动检查时,它似乎是正确的,但是编译时会给出不同的模式

4

7 回答 7

8

相当简单:使用两个循环,一个用于向上计数,一个用于向下计数。"0"在两者之间打印文字。

#include <stdio.h>

int main()
{
    for (int i = 0; i < 10; i++) {
        for (int j = 10 - i; j < 10; j++)
            printf("%d", j);

        printf("0");

        for (int j = 9; j >= 10 - i; j--)
            printf("%d", j);

        printf("\n");
    }

    return 0;
}
于 2013-07-01T11:13:11.230 回答
2

像 H2CO3 一样,但既然我们只打印个位数,为什么不使用putchar()

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
  int i, j;

  for(i = 0; i < 10; ++i)
  {
    // Left half.
    for(j = 0; j < i; ++j)
      putchar('9' - i + j + 1);
    // Center zero.
    putchar('0');
    // Right half.
    for(j = 0; j < i; ++j)
      putchar('9' - i + j + 1);
    putchar('\n');
  }
  return EXIT_SUCCESS;
}
于 2013-07-01T11:18:27.770 回答
0

与其使用 printf 输出 mid 0,不如使用循环本身打印它。可以使用以下简短的代码:

int main()
{
    int m = 10, n, p;
    while(m >= 1)
    {
        for(n = m; n <= 10; n++)
            printf("%d", n % 10);
        for(p = n - 2; p >= m; p--)
            printf("%d", p );
        printf("\n");
        m--;
    }
    return 1;
}
于 2013-07-01T11:20:19.077 回答
0

对于高吞吐量(尽管在清晰度方面值得怀疑):

#include <stdio.h>

int main() {
    char const digits[] = "1234567890";
    char const rdigits[] = "9876543210";

    for (int i = 0; i < 30; ++i) {
        int k = i % 10;
        fputs(digits + 9 - k, stdout);
        for (int j = 9; j < i; j += 10) fputs(digits, stdout);
        for (int j = 9; j < i; j += 10) fputs(rdigits, stdout);
        fwrite(rdigits, 1, k, stdout);
        fputs("\n", stdout);
    }
}
于 2013-07-01T11:27:50.683 回答
0
#include <stdio.h>

void print(int i){
    if(i == 10){
        putchar('0');
        return ;
    } else {
        printf("%d", i);
        print(i+1);
        printf("%d", i);
    }
}

int main(void){
    int i;
    for(i = 10; i>0; --i){
        print(i);
        putchar('\n');
    }
    return 0;
}
于 2013-07-01T11:58:59.693 回答
0

这是一个 C# 版本:

static void DrawNumberTriangle()
{
    for (int line = 10; line >=1; line--)
    {
        for (int number = line; number < 10; number++)
        {
            System.Console.Write(number);
        }
        System.Console.Write("0");
        for (int number = 9; number > line - 1; number--)
        {
            System.Console.Write(number);
        }

        System.Console.WriteLine();
    }
}

我建议将您的 i,j,x,z,k,f 变量重命名为具有我使用的含义的变量。这有助于使您的代码更易于遵循。

于 2013-07-01T11:18:33.233 回答
0

修改后的代码:检查您的错误:

# include<stdio.h>
# include<conio.h>

int main()
{
// clrscr();
 int i,j,x,z,k,f=1;

 for ( i=10;i>=1;i--,f++)
 {
     k=i;                    // K=i should be outside of loop.
     for(j=1;j<=f;j++,k++)
     {

         if(k!=10)
         {
             printf("%d",k);
         }

         if(k==10)
         {
        printf("0");
         }
}
     z=9;                    //z=9 should be outside loop.
     for(x=1;x<f;x++,z--)
     {
         printf("%d",z);
     }

printf("\n");

}
//getch();
return 0;
}

您在 for 循环(具有 j 的循环)中定义 k=i ,因此每次 k 获取 i 的值,因此它总是获取 i 的值并打印该值,而您的另一个条件(if(k==10))将永远不会是真的,因为每次 k 取值 i 并且 i 在循环的第一次迭代后小于 10 并且循环内的 z=9 所以每次执行循环时它都取值 z=9 所以它打印错误的值。

于 2013-07-01T11:14:20.703 回答