字母的斐波那契

Fibonacci for letters

提问人:ruwby 提问时间:10/31/2023 最后编辑:Nimantharuwby 更新时间:11/7/2023 访问量:125

问:

我正在为我的大学提供的案例编写代码。这是关于制作斐波那契函数,但对于字母。例如,如果 -> , -> ,则 -> ,依此类推。当我发现一个我无法解决的问题时,我离完成还有一半。f(0)af(1)bf(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

3第 1 行是测试用例的数量,第 2 行是 的结果,第 2 行是 和 的结果,

2f(n)abf(0)f(1)

输出将是:

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

当我尝试输入超过 .我尝试使用函数来减慢这个过程,因为我认为这是问题的根源。 只帮我,直到再多几 n 个范围。n3usleepusleep

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

char c-strings 斐波那契 函数定义

评论

0赞 pmg 10/31/2023
char wordBank[][700] = {{},{}};定义为仅包含两个数组的数组,每个数组包含 700 个字符(所有 1400 个字符均为 )。尝试wordBank'\0'char wordBank[700][700];
1赞 Gyro Gearloose 10/31/2023
“等等”不是一个好的描述。也许这意味着二进制输出,将“0”替换为“a”,将“1”替换为“b”?如果是这样,请执行传统的斐波那契计算,将输出转换为二进制字符串,并相应地将“0,1”替换为“a,b”。
1赞 greg spears 10/31/2023
我不认为你说的逻辑足够多,我们可以帮助你。即:如果 f(0) = a,f(1) = b ...好吧,我还和你在一起......则 f(2) = ba。(??)...那么 f(3) = cba 吗?这让我非常费解。至少我可以告诉你,每个循环只能做 3 个输入,因为你的 scanf(“%d %c %c” ,...) 被编码为正好接受 3 个输入。
1赞 Tyler 10/31/2023
f(0) = 一个;f(1) = b;f(2) = f(1) + f(0) = ba;f(3) = f(2) + f(1) = 巴布;f(4) = f(3) + f(2) = 巴巴;那是什么模式?
0赞 Gyro Gearloose 10/31/2023
对不起,我在用 java 思考,但你在 C/C++ 上。使用 C 可以更容易地不转换为 String.class,而只需使用整数结果的位通过查看最低有效位来获得“a”和“b”,然后向右移动。

答:

2赞 pmg 11/1/2023 #1

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

尝试定义更大的数组

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

查看 https://ideone.com/W9guSZ

0赞 Vlad from Moscow 11/1/2023 #2

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

#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]);
}

when 大于此值会导致未定义的行为。n2

根据赋值,函数应构建一个新字符串。

它应该声明为:

char * fib( 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