提问人:ruwby 提问时间:10/31/2023 最后编辑:Nimantharuwby 更新时间:11/7/2023 访问量:125
字母的斐波那契
Fibonacci for letters
问:
我正在为我的大学提供的案例编写代码。这是关于制作斐波那契函数,但对于字母。例如,如果 -> , -> ,则 -> ,依此类推。当我发现一个我无法解决的问题时,我离完成还有一半。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
3
第 1 行是测试用例的数量,第 2 行是 的结果,第 2 行是 和 的结果,2
f(n)
a
b
f(0)
f(1)
输出将是:
Case #1: ba
Case #2: bab
Case #3: babba
当我尝试输入超过 .我尝试使用函数来减慢这个过程,因为我认为这是问题的根源。 只帮我,直到再多几 n 个范围。n
3
usleep
usleep
和保证为 1 个字母,因此 和 不能是 or 的“ab”或任何其他超过 1 个字母的组合。f(0)
f(1)
f(0)
f(1)
f(0)
f(1)
答:
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]);
}
when 大于此值会导致未定义的行为。n
2
根据赋值,函数应构建一个新字符串。
它应该声明为:
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
评论
char wordBank[][700] = {{},{}};
定义为仅包含两个数组的数组,每个数组包含 700 个字符(所有 1400 个字符均为 )。尝试wordBank
'\0'
char wordBank[700][700];