-4

Cでこの数列を生成する方法を理解しようとしています.

0, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 8, 9 …

シーケンスは、以下に示すように、数字の三角形を形成することによって生成されます。

0
1 2
3 4 5
6 7 8 9 ...

一連の次の 2 つの番号は次のとおりです。

  1. 次の番号はすぐ下にあります
  2. Next to next は 1 つ右の場所にあります。

0
|\
1 2

Series -> 0, 1, 2

0
|\
1 2
|\|\
3 4 5

Series -> 0, 1, 2, 3, 4, 4, 5, ........

この数の三角形をトラバースして、C でこのシーケンスを取得するにはどうすればよいですか?

0 は 1 と 2 に置き換えられます 1 は 3 と 4 に置き換えられます 2 は 4 と 5 に置き換えられます

0
|\
1 2
|\|\
3 4 5
|\|\|\
6 7 8 9

Series -> 0, 1, 2, 3, 4, 4, 5, 6, 7, 7, 8, 7, 8, 8, 9 ........

だということだ

I. 0 を解く

0 leads to 1 and 2

0 -> 1 - 2
0 1 2

Ⅱ.1と2を解く

1 leads to 3 and 4

1 -> 3 - 4
0 1 2 3 4

2 leads to 4 and 5

2 -> 4 - 5
0 1 2 3 4 4 5

III. 3、4、4、5を解く

3 leads to 6 and 7

3 -> 6 - 7
0 1 2 3 4 4 5 6 7

4 leads to 7 and 8

4 -> 7 - 8
0 1 2 3 4 4 5 6 7 7 8

4 leads to 7 and 8

4 -> 7 - 8
0 1 2 3 4 4 5 6 7 7 8 7 8

5 leads to 8 and 9

5 -> 8 - 9
0 1 2 3 4 4 5 6 7 7 8 7 8 8 9

説明が不十分で申し訳ありません。今回は説明できればと思います。

4

3 に答える 3

2

(説明に基づいて)あなたのシーケンスは確かにあるべきだと思います

 0
 1  2
 3  4  4  5
 6  7  7  8  8  9
10 11 11 12 12 13 13 14

次のようなコードで作業できます。

int nextRowStart = 0;
int nextRowSize = 1;

for (int curr = 0; /*put some ending condition here*/; curr++)
{
    yield(curr)
    if (curr != nextRowStart - 1 && curr != nextRowStart)
        yield(curr);
    if (curr == nextRowStart)
    {
        nextRowStart += nextRowSize;
        nextRowSize++;
    }
}

void yield(int x)
{
    printf("%d ", x);
}

変更された質問により、新しい質問を再帰的に行うことができます

これはC#での解決策です:

IEnumerable<int> Generate(int level)
{
    if (level == 0)
    {
        yield return 0;
        yield break;
    }

    int diff = level;
    foreach (int n in Generate(level - 1))
    {
        yield return n + diff;
        yield return n + diff + 1;
    }
}

var result = Enumerable.Range(0, maxLevel).SelectMany(Generate);

Cに翻訳するのに少し時間がかかります...


C ソリューション:

void Generate(int level, int* resultsize, int** result)
{
    if (level == 0)
    {
        *result = (int*)malloc(sizeof(int));
        (*result)[0] = 0;
        *resultsize = 1;
    }
    else
    {
        int recResultSize;
        int* recResult;
        Generate(level - 1, &recResultSize, &recResult);
        *resultsize = recResultSize * 2;
        *result = (int*)malloc(*resultsize * sizeof(int));
        for (int i = 0; i < recResultSize; i++)
        {
            (*result)[2*i]     = recResult[i] + level;
            (*result)[2*i + 1] = recResult[i] + level + 1;
        }
        free(recResult);
    }
}
于 2012-10-30T14:53:40.267 に答える
2

これは、正確な結果を出し、問題を解決するコードです。@Lundinが自分のコードを投稿するように頼んだとき、私はこの結果に達しました。もう一度やり直して成功しました。みんなありがとう。

#include<stdio.h>

int in;

int main(){
 int  ik, it, icount = 0, ih, temp, ig = 1;
 int aisum[100];
     aisum[0] = 0;
     scanf("%d",&in);
     printf("0\n");
     it = 1;ih = 0;temp = 2;
     for(icount = 0,ig = 1; icount <= in; icount++){
                for(ik = 0; ik<2; ik++){
                        aisum[ig] = aisum[icount] + it + ik ;
                        printf("%d ",aisum[ig]);
                        ig++;
                }

                if(aisum[icount] == ih){
                    printf("\n");
                    it++;
                    ih += temp;
                    temp++;
                }
     }

 return 0;
}
     /*Input the number of elements to be processed*/
     /*icount will account for new elements to be formed like if we look
     at pascal triangle
     0 will form 1 and 2
     1 will form 3 and 4
     */
     /*ig will account for array indices*/
     /*it will account for the periodic addition */
     /*ih checks for the codnition for it to increement
     0
     1 2
     3 4 5
     it will be increemented at 0, 2, 5 ...
     */
于 2012-10-31T21:19:00.987 に答える