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可能な限り重くなるように(つまり、ループ、変数、コード行、および関数呼び出しの数を最小限に抑える)、ソリューションを使用することを主張しました。

数学関数自体に関するwikiの記事は次のとおりです。

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

楽しみ!

于 2012-10-30T22:05:23.447 に答える
1

さて、長さが1から6まで変化し、その後戻ってきて、0からその長さまでの記号を除外した文字列があることに気付きました。

したがって、これは2つのループで行うことができます。1つは昇順、もう1つは降順で、両方ともネストされてすべてのシンボルを取得します。

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

前のサイクルの終わりから開始するため、2番目forはに置き換えることができます。while(--i)i

出力:

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

Nループの代わりに、最後のカウンターが制限を超えたときにカウンターと制限をリセットする単一のループを使用します。古いループの1つが終了したら、改行を挿入し、カウンターを-1に戻し、制限(カウンターをテストする変数)をインクリメントします。

于 2012-10-30T21:54:34.190 に答える
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 に答える