如何以三角形形式生成数字模式

时间:2013-07-01 11:00:31

标签: c

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

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();
    }

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

7 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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;
}

答案 2 :(得分: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循环中定义k = i(循环有j)所以每次k得到i的值,因此它总是得到i的值并打印该值和你的另一个条件(if(k == 10) ))永远不会是真的,因为每次k取i的值并且在循环的第一次迭代之后i小于10并且z = 9内部循环因此每次执行循环时它取值z = 9因此它打印错误的值

答案 3 :(得分: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变量重命名为具有与我使用的变量相似的变量。这有助于简化您的代码。

答案 4 :(得分: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;
}

答案 5 :(得分: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);
    }
}

答案 6 :(得分: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;
}