斐波那契字母

问题描述 投票:0回答:2

我正在为我的大学提供的一个案例编写代码。这是关于创建斐波那契函数,但是针对字母。例如,如果 f(0) = a、f(1) = b,则 f(2) = ba,依此类推。我一直在完成一半,直到我发现了一个我不知道原因的问题。请帮我解决一下。

#include <stdio.h>
#include <unistd.h>
#include <string.h>

void fib(char bank[][700], char result[700], int n){
    
    char temp[700];
    for(int i = 2; i <= n; i++){
        if(i > 2){
            strcpy(bank[i - 1], result);
        }
        for(int k = 0; bank[i - 1][k] != 0; k++){
            result[k] = bank[i - 1][k];
        }
        strcat(result, bank[i - 2]);
    }
}

int main(){
    int cases = 0;
    scanf("%d", &cases); getchar();
    
    for(int i = 1; i <= cases; i++){
        
        int n = 0; char first[5] = {};
        char wordBank[][700] = {{},{}};
        char result[700] = "#";
        scanf("%d %c %c", &n, &first[0], &first[1]);
        getchar();
        wordBank[0][0] = first[0];
        wordBank[1][0] = first[1];
        
        if(n == 0){
            printf("Case #%d: %c\n", i, first[0]);
        } else if(n == 1){
            printf("Case #%d: %c\n", i, first[1]);
        } else if(n > 1){
            fib(wordBank, result, n);
            printf("Case #%d: %s\n", i, result);
        }
    }
    
    return 0;
}

所以示例输入是:

3
2 a b
3 a b
4 a b

第 1 行 3 是测试用例的数量,
第 2 行 2 是 f(n) 的结果,
f(0) 和 f(1) 中第 2 行的 a 和 b,

输出将是:

Case #1: ba
Case #2: bab
Case #3: babba

当我尝试输入 n 超过 3 时,就会出现问题。我尝试使用 usleep 函数来减慢进程,因为我认为这就是问题的根源。 usleep 只会帮助我直到更多 n 个范围。

编辑:f(0) 和 f(1) 保证为 1 个字母,因此 f(0) 或 f(1) 不能为“ab”,或者 f(0) 的任何其他超过 1 个字母的组合) 和 f(1)。

编辑2:谢谢PMG!你的解决方案有效!现在我可以生成 n 超过 3 的斐波那契结果。我还是 stackoverflow 的新手,所以我不知道如何直接回复您的评论,而不是在这里表达我的谢意。

c fibonacci
2个回答
1
投票

char wordBank[][700] = {{},{}};
将 wordBank 定义为一个由仅两个数组组成的数组,每个数组包含 700 个字符(所有 1400 个字符均为
'\0'
)。

尝试定义一个更大的数组

char wordBank[100][700] = {0};

参见https://ideone.com/W9guSZ


0
投票

对于初学者来说,这个标题

#include <unistd.h>

是多余的,因为程序中没有使用头文件中的声明。

没有参数的函数

main
应声明为

int main( void )

使用函数

getchar
,例如本行

scanf("%d", &cases); getchar();

也是多余的。您应该删除

getchar
的通话。

不清楚为什么你在程序中使用神奇数字

700

在函数内数组

temp

char temp[700];

未使用。

您声明了数组

wordBank

char wordBank[][700] = {{},{}};

只有两个元素。但在函数内,由于循环,可以访问数组外部的内存

for(int i = 2; i <= n; i++){
    if(i > 2){
        strcpy(bank[i - 1], result);
    }
    for(int k = 0; bank[i - 1][k] != 0; k++){
        result[k] = bank[i - 1][k];
    }
    strcat(result, bank[i - 2]);
}

n
大于
2
时。

根据分配,函数应该构建一个新字符串。

应该这样声明

char * C_fibonacci( size_t n, char c1, char c2 );

使用任意两个初始字符。函数的调用者应该将字符传递给函数。

我将按照以下方式定义该函数,如下面的演示程序所示。

#include <stdio.h>
#include <string.h>

char * fib( size_t n, char c1, char c2 )
{
    size_t first = 0;
    size_t second = 1;

    size_t length = 1;

    for (size_t i = 0; i < n; i++)
    {
        length += first;
        second += first;
        first = second - first;
    }

    char *result = calloc( length + 1, 1 );

    if (result != NULL)
    {
        size_t previous_size = 0;
        size_t next_size = 0;

        char *p = result;

        size_t i = 0;

        do
        {
            switch (i)
            {
            case 0:
                *p = c1;
                break;

            case 1:
                *p = c2;
                break;

            case 2:
                *p++ = c2;
                *p++ = c1;
                next_size = 1;
                previous_size = 1;
                break;

            case 3:
                *p++ = c2;
                break;

            default:
                memcpy( p, result, previous_size );
                p += previous_size;
                break;
            }

            next_size += previous_size;
            previous_size = next_size - previous_size;
        } while ( i++ < n);
    }

    return result;
}

int main( void )
{
    const size_t N = 10;

    for (size_t i = 0; i < N; i++)
    {
        char *s = fib( i, 'a', 'b');
        if ( s != NULL ) puts( s );
        free( s );
    }
}

程序输出为

a
b
ba
bab
babba
babbabab
babbababbabba
babbababbabbababbabab
babbababbabbababbababbabbababbabba
babbababbabbababbababbabbababbabbababbababbabbababbabab
© www.soinside.com 2019 - 2024. All rights reserved.