C 有多少种方法可以使n的数字长度从0、1和2变为?

C 有多少种方法可以使n的数字长度从0、1和2变为?,c,C,您的数字长度为n,由3个数字组成:0、1和2: 021112201... a) 如果两个零不能保持在一起,有多少种方法可以得到这个数字? b) 如果两个0和两个1不能保持在一起,有多少种方法可以得到这个数字 我在下面编写了解决这个问题的代码。有没有办法用简单的公式手动计算此任务 #include <stdio.h> int main() { int n; //length scanf("%d", &n); int a[n+1][3];

您的数字长度为n,由3个数字组成:0、1和2:
021112201...

a) 如果两个零不能保持在一起,有多少种方法可以得到这个数字?
b) 如果两个0和两个1不能保持在一起,有多少种方法可以得到这个数字

我在下面编写了解决这个问题的代码。有没有办法用简单的公式手动计算此任务

#include <stdio.h>  

int main() {   
    int n; //length 
    scanf("%d", &n);
    int a[n+1][3];
    a[1][0]=a[1][1]=a[1][2];
    for (int i=2; i<=n; ++i) {
        // only for zeroes
        a[i][0] = a[i-1][0]+a[i-1][1]+a[i-1][2];
        a[i][1] = a[i-1][0]+a[i-1][2];
        a[i][2] = a[i-1][0]+a[i-1][1]+a[i-1][2];
        // for zeroes and ones
        /*
        a[i][0] = a[i-1][0]+a[i-1][1]+a[i-1][2];
        a[i][1] = a[i-1][0]+a[i-1][2];
        a[i][2] = a[i-1][0]+a[i-1][1];
        */
     }
     printf("sum: %d;", a[n][0] + a[n][1] +  a[n][2];
     return 0;
#包括
int main(){
int n;//长度
scanf(“%d”和“&n”);
INTA[n+1][3];
a[1][0]=a[1][1]=a[1][2];

对于(inti=2;i当我理解正确时,您的代码并没有做它应该做的事情。 为了确保我们讨论的是同一个问题:

length 2:
00 not ok
01, 02, 11, 12, 20, 21, 22 ok
length 3:
001,...,200 not ok
010,011,101, 201...,222 ok
您想知道标有“ok”的数字的数量

您可以构建一个树,其中来自根的每个路径都是有效数字(不包含00)

您需要计算第n个级别中的节点数

这与询问Lindenmayer系统产生的单词有多长相同()。 “a”表示1或2,“b”表示0

    a->baa, (when you have a 1 or 2 as first digit, you can add 0, 1, or 2)
    b->aa (when you have a 0 as first digit you can only add 1 or 2)
从单个“a”开始,应用此替换规则n次

step 0: a
step 1: b a a
step 2: aa baa baa
step 3: baa baa  aa baa baa aa baa baa
你应该看看上面这棵树的类比。 由此可以得到一个递归公式

length(n+1)=(length(n)+length(n-1))*2
startig with length(0)=1, length(1)=3
这个公式应该是正确的。我还没有找到一个简单的公式

以下代码应计算正确的结果:

int x1 = 1, x2=3;
for(int i = 1; i < n; ++i) {
    int x = 2 * (x1 + x2);
    x1 = x2;
    x2 = x
}
// result is in x2
其中“a”表示0或1,“b”表示2。 这种情况下的公式:

length(n+1)=length(n)*2+length(n-1)
startig with length(0)=1, length(1)=3

当我理解正确时,您的代码并没有做它应该做的事情。 为了确保我们讨论的是同一个问题:

length 2:
00 not ok
01, 02, 11, 12, 20, 21, 22 ok
length 3:
001,...,200 not ok
010,011,101, 201...,222 ok
您想知道标有“ok”的数字的数量

您可以构建一个树,其中来自根的每个路径都是有效数字(不包含00)

您需要计算第n个级别中的节点数

这与询问Lindenmayer系统产生的单词有多长相同()。 “a”表示1或2,“b”表示0

    a->baa, (when you have a 1 or 2 as first digit, you can add 0, 1, or 2)
    b->aa (when you have a 0 as first digit you can only add 1 or 2)
从单个“a”开始,应用此替换规则n次

step 0: a
step 1: b a a
step 2: aa baa baa
step 3: baa baa  aa baa baa aa baa baa
你应该看看上面这棵树的类比。 由此可以得到一个递归公式

length(n+1)=(length(n)+length(n-1))*2
startig with length(0)=1, length(1)=3
这个公式应该是正确的。我还没有找到一个简单的公式

以下代码应计算正确的结果:

int x1 = 1, x2=3;
for(int i = 1; i < n; ++i) {
    int x = 2 * (x1 + x2);
    x1 = x2;
    x2 = x
}
// result is in x2
其中“a”表示0或1,“b”表示2。 这种情况下的公式:

length(n+1)=length(n)*2+length(n-1)
startig with length(0)=1, length(1)=3

如果你写了代码,你就有了公式……是的,有一种方法可以计算出来——他们会知道怎么做。你应该首先整理好你的算法,然后才能尝试用C语言编写代码。避免使用智能引号
%d“
。使用引号
%d”
a[1][0]=a[1][1]=a[1][2];
int a[n+1][3]之后;
是一个问题。它将
a[1][2]
分配给
a[1][0],a[1][1]
,而
a[1][2]
值,其本身尚未赋值/初始化。如果您编写了代码,您就有了公式…是的,有一种方法可以计算出来-他们会知道如何计算。您应该首先整理好算法,然后才能尝试用C编写代码。避免使用智能引号
“%d”
使用引号
“%d”
a[1][0]=a[1][1] =a[1][2];
int a[n+1][3]之后;
是一个问题。它将
a[1][2]
分配给
a[1][0],[1][1]
值,但
a[1][2]
本身尚未分配/初始化。