我正在为我的大学提供的一个案例编写代码。这是关于创建斐波那契函数,但是针对字母。例如,如果 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 的新手,所以我不知道如何直接回复您的评论,而不是在这里表达我的谢意。
char wordBank[][700] = {{},{}};
将 wordBank 定义为一个由仅两个数组组成的数组,每个数组包含 700 个字符(所有 1400 个字符均为 '\0'
)。
尝试定义一个更大的数组
char wordBank[100][700] = {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