3

你好写了一个程序,比这个要好;

0

01

012

0123

01234

012345

01234

0123

012

01

0

我很确定我的方法又长又愚蠢,这就是它的样子

#include <stdio.h>

int main(void)
{

int first = -1, second = -1, third = -1, fourth = -1, fifth = -1, sixth = -1, seventh = -1, eight = -1, nine = -1, ten = -1, elleven = -1;

while(first < 0){
first += 1; 
printf("%d\n", first);

while(second < 1){
second += 1;
printf("%d", second);
}
printf("\n");
while(third < 2 ){
third += 1;
printf("%d", third);
}
printf("\n");
while(fourth < 3){
fourth += 1;
printf("%d", fourth);
}
printf("\n");
while(fifth < 4){
fifth += 1;
printf("%d", fifth);
}
printf("\n");
while(sixth < 5){
sixth += 1;
printf("%d", sixth);
}
printf("\n");
while(seventh < 4){
seventh += 1;
printf("%d", seventh);
}
printf("\n");
while(eight < 3){
eight += 1;
printf("%d", eight);
}
printf("\n");
while(nine < 2) {
nine += 1;
printf("%d", nine);
}
printf("\n");
while(ten < 1){
ten += 1;
printf("%d", ten);
}
printf("\n");
while(elleven < 0){
elleven += 1;
printf("%d", elleven); 
}
}

return 0;
}

如果有人愿意告诉我如何更容易地做到这一点?:)

4

5 回答 5

2

这些产生三角形输出的问题在数学上接近它们时总是最简单的。考虑绝对值函数(例如:|x|abs(x))。

#include <stdio.h>
#include <stdlib.h>
#define LARGEST_NUMBER (5)
#define MAX_VAL (LARGEST_NUMBER+1)

int main(void) {
   int i,j;
   for(i=0; i<2*MAX_VAL; i++) {
      for(j=0; j<MAX_VAL-abs(MAX_VAL-i); j++) {
         printf("%d",j);
      }
      printf("\n");
   }
   return 0;
}

输出:

0
01
012
0123
01234
012345
01234
0123
012
01
0

我觉得这是解决这类问题在数学上最简洁的方法。我过去曾为学生提供过这个确切的问题,并坚持使用该abs()函数的解决方案使该函数factored尽可能重(即:最少数量的循环、变量、代码行和函数调用)。

这是关于数学函数本身的维基文章:

http://en.wikipedia.org/wiki/Absolute_value#Absolute_value_function

享受!

于 2012-10-30T22:05:23.447 回答
1

好吧,我注意到您有一个字符串,其长度从 1 到 6 不等,然后返回,其中包含从 0 到其长度被排除的符号。

所以我们可以用两个循环来做到这一点,一个升序,一个降序,都嵌套以获取所有符号。

    int i, j;

    for (i = 0; i < 6; i++)
    {
            for (j = 0; j <= i; j++)
                    printf("%d", j);
            printf("\n");
    }
    for (i = 5; i > 0; i--)
    {
            for (j = 0; j < i; j++)
                    printf("%d", j);
            printf("\n");
    }

第二个for可以替换为while(--i), 因为i从上一个周期的末尾开始。

输出:

0
01
012
0123
01234
012345
01234
0123
012
01
0
于 2012-10-30T21:54:43.443 回答
0

这是我的尝试:

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

        printf("\n");
    }


    for (i = 4; i >= 0; --i) {
        for (j = 0; j <= i; ++j)
            printf("%d", j);

        printf("\n");
    }

    return 0;
}
于 2012-10-30T21:55:47.450 回答
0

这是使用while 循环的版本。

#include <stdio.h>
#define MAX 5

int main()
{
    int j=0, m=0, dec=0;
    while( m>=0 && m<=MAX)
    {
        for (j = 0; j <= m; j++)
             printf("%d", j);
        printf("\n");

        if (m==MAX)
            dec = 1; // once hit MAX, chg inc to dec

        (dec)? m--: m++;
    }
}
于 2012-10-30T22:34:21.600 回答
0

代替 N 循环使用单个循环,一旦最后一个计数器运行超过其限制,该循环将重置其计数器和限制。当一个旧循环结束时,插入一个换行符,将计数器设置回 -1,并增加限制(您要测试计数器的变量)。

于 2012-10-30T21:54:34.190 回答