更简单的写循环方式

时间:2012-10-30 21:47:59

标签: c loops while-loop

Hello写了一个打印出来的程序;

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

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

5 个答案:

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

享受!

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

答案 2 :(得分:0)

而不是N个循环使用单个循环,它会重置其计数器并在最后一个计数器超过其限制时限制。当其中一个旧循环结束时,插入换行符,将计数器设置回-1,并递增限制(要测试计数器的变量)。

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

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