C 如何计算斐波那契字的第n个字符?

C 如何计算斐波那契字的第n个字符?,c,fibonacci,C,Fibonacci,问题是找到长度大于给定长度的第一行(在斐波那契字序列中)的第n个字符 例如: A = 1415926535 B = 8979323846 Find F(n) for n = 35 The first few terms of are: 1415926535, 8979323846, 1415926535 8979323846, 8979323846 1415926535 8979323846, 1415926535 8979323846 8979323846 1

问题是找到长度大于给定长度的第一行(在斐波那契字序列中)的第n个字符

例如:

A = 1415926535  
B = 8979323846  
Find F(n) for n = 35  
The first few terms of  are:  
1415926535,  
8979323846,  
1415926535 8979323846,  
8979323846 1415926535 8979323846,  
1415926535 8979323846 8979323846 1415926535 8979323846  
这里第五行是第一个包含超过35个字符的行,所以F(35)=第35个字符,即9就是答案

我尝试使用定义为的结构数组

typedef struct obj
{
    struct obj *one;
    struct obj *two;
    char len[101]; //Given maximum length 100
    char string;
} OBJ;
OBJ result[300]; //Given that n < 2^100 which means around 250 lines max. 

//Here i denotes line number.
result[1].string = 'a';
strcpy(result[1].len, len_a);
result[2].string = 'b';
strcpy(result[2].len, len_b);
int i = 3;
while (1)
{
    result[i].one = &result[i - 2];
    result[i].two = &result[i - 1];
    strcpy(result[i].len, addStrings(result[i - 1].len, result[i-2].len));
    if (compareStrings(result[i].len, char_n) >= 0)
        break;
    i++;
}  
while (1)
{
    if (solution->string == 'a')
    {
        n = strtoull(char_n, &end, 10);
        return a[n - 1];
    }
    if (solution->string == 'b')
    {
        n = strtoull(char_n, &end, 10);
        return b[n - 1];
    }
    if (compareStrings(solution->one->len, char_n) >= 0)
    { 
        solution = solution->one;
        i -= 2;
    }
    else
    {
        char_n = subStrings(char_n, solution->one->len); 
        //n = n-len(one)
        solution = solution->two;
        i -= 1;
    }
}
typedef结构对象
{
结构对象*1;
结构对象*2;
char len[101];//给定的最大长度为100
字符串;
}OBJ;
OBJ结果[300]//假设n<2^100,这意味着最多250行。
//这里我表示行号。
结果[1]。字符串='a';
strcpy(结果[1]。len,len_a);
结果[2]。字符串='b';
strcpy(结果[2]。len,len_b);
int i=3;
而(1)
{
结果[i]。一=&结果[i-2];
结果[i].two=&result[i-1];
strcpy(结果[i].len,addStrings(结果[i-1].len,结果[i-2].len));
if(比较字符串(结果[i].len,char\u n)>=0)
打破
i++;
}  
而(1)
{
如果(解决方案->字符串=='a')
{
n=strtoull(字符和结束,10);
返回[n-1];
}
如果(解决方案->字符串=='b')
{
n=strtoull(字符和结束,10);
返回b[n-1];
}
如果(比较字符串(解决方案->一->长度,字符)>=0)
{ 
解决方案=解决方案->一;
i-=2;
}
其他的
{
char\u n=子字符串(char\u n,solution->one->len);
//n=n-len(一个)
解决方案=解决方案->两个;
i-=1;
}
}
其中指针一指向最后一个第二个元素,指针二指向最后一个元素,len指向字符串的长度。这里len是处理大于2^64的数字的字符串。在我尝试过的所有情况下,加法和减法的函数都已定义并工作。完整代码如下:[第二次尝试][4]


大约9次测试失败。我还缺少什么吗?

你是在寻求解决问题的方法吗?真正的挑战不是你自己去做你所要求的吗?是的。我已经用python做过了。我想知道怎么用C来做,你把我弄丢了。您谈论的是位置127654101697653297,以及诸如2^50之类的位置,但您传递的是限制为2^31的
int
变量(即2147483648)。在这些极端情况下,它不应该太慢,它应该是不正确的。在你所引用的问题中,你所遵循的答案是关于处理大标记的,但我在你的C或Python代码中都没有看到。我遗漏了什么?你的问题最初是关于你的代码速度,现在它被重写为关于你的坏算法。我已经相应地删除了我的答案。你是在要求解决问题吗?真正的挑战不是你自己去做你所要求的吗?是的。我已经用python做过了。我想知道怎么用C来做,你把我弄丢了。您谈论的是位置127654101697653297,以及诸如2^50之类的位置,但您传递的是限制为2^31的
int
变量(即2147483648)。在这些极端情况下,它不应该太慢,它应该是不正确的。在你所引用的问题中,你所遵循的答案是关于处理大标记的,但我在你的C或Python代码中都没有看到。我遗漏了什么?你的问题最初是关于你的代码速度,现在它被重写为关于你的坏算法。我已相应地删除了我的答案。