Arrays 如何减少此代码中的执行时间? 问题
考虑前N个斐波那契数的最后十进制数字的序列D,即Arrays 如何减少此代码中的执行时间? 问题,arrays,c,Arrays,C,考虑前N个斐波那契数的最后十进制数字的序列D,即D=(F0%10,F1%10,…,FN−1%10) 现在,您应该执行以下过程: Let D=(D1,D2,…,Dl) 如果l=1,则过程结束 创建一个新序列 E=(D2,D4,…,D2⌊l/2⌋) 换句话说,E是通过从D中删除所有奇数索引元素而创建的序列 将D改为E 当该进程终止时,序列D 只包含一个数字。你必须找到这个号码 输入 输入的第一行包含一个整数T 表示测试用例的数量 T测试用例的描述如下。 每个测试用例的第一行也是唯一一行包含一个整
D=(F0%10,F1%10,…,FN−1%10)
现在,您应该执行以下过程:
Let D=(D1,D2,…,Dl)
如果l=1,则过程结束
创建一个新序列
E=(D2,D4,…,D2⌊l/2⌋)
换句话说,E是通过从D中删除所有奇数索引元素而创建的序列
将D改为E
当该进程终止时,序列D
只包含一个数字。你必须找到这个号码
输入
输入的第一行包含一个整数T
表示测试用例的数量
T测试用例的描述如下。
每个测试用例的第一行也是唯一一行包含一个整数N
输出
对于每个测试用例,打印一行,其中包含一个整数―最后剩余的数字
密码
#包括
#包括
int测试(int*arr,int n);
int main(){
int t;
scanf(“%d”、&t);
而(t--){
int n;
scanf(“%d”和“&n”);
int*arr;
arr=(int*)malloc((n+1)*sizeof(int));
arr[1]=0;
arr[2]=1;
对于(int i=3;i,使用
查找最大整数A
,例如2^A
查找Fibonnaci(2^A-1)%10
添加到的,其本身基于以下其他答案:
你最终总会得到2n− 其中n为最大整数,2n
我想指出另一个有用的数学性质
在数论中,第n个Pisano周期,写为π(n),是取模n的斐波那契数序列重复的周期。
()
<这里我们需要考虑n=10,π(10)=60的情况,最后的十进制数字对应于OEIS序列:
0,1,1,2,3,5,8,3,1,4,5,9,4,3,7,0,7,7,4,1,5,6,1,7,8,5,3,8,1,9,0,9,9,8,7,5,2,7,9,6,5,1,6,7,3,3,6,9,4,9,3,2,5,7,9,1
因此,不需要计算实际的斐波那契数,也不需要生成N之前的所有序列。@4386427:这取决于您是从0还是从1索引。通常斐波那契序列是从0索引的。
#include <stdio.h>
#include <stdlib.h>
int test(int *arr, int n);
int main() {
int t;
scanf("%d", &t);
while (t--) {
int n;
scanf("%d", &n);
int *arr;
arr = (int *)malloc((n + 1) * sizeof(int));
arr[1] = 0;
arr[2] = 1;
for (int i = 3; i <= n; i++) {
arr[i] = arr[i - 1] + arr[i - 2];
}
/*
for(int k=1;k<=n;k++){
printf("%d ",arr[k] );
}
printf("\n");
*/
printf("%d\n", (test(arr, n)) % 10);
}
}
int test(int *arr, int n) {
if (n == 1) {
return arr[1];
} else {
for (int i = 1; i <= (n / 2); i++) {
arr[i] = arr[2 * i];
}
return test(arr, n / 2);
}
}