Fibonacc数列Fn项取余
题目描述
斐波那契数列是一组第一位F1和第二位F2为1,从第三位开始,后一位是前两位和的一组递增数列Fn=Fn-1+Fn-2。 那么当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
如:
输入格式
输入包含一个整数n。
输出格式
输出一行,包含一个整数,表示Fn除以10007的余数。
样例输入10 此时Fibonacc[ ] = {1,1,2,3,5,8,13,21,34,55}
样例输出55
样例输入22 此时Fibonacc[ ] = {1,1,2,3,5,8,13,21,34,55…,10946,17711}
样例输出7704
题目分析
此处使用了动态定义数组方式,将数组实现动态规划长度,使用了malloc
函数,关于malloc
函数可以参照malloc的用法和意义,有关于malloc
的一些详细讲解,在这儿不做过多的解释,简要介绍些动态定义数组长度的方式
malloc函数的使用格式一般为
int len;
int * Num = (int*)malloc(sizeof(int) * len); //len生成的数组长度,此时Num就是一个为int类型的,可以容纳len个元素的动态数组
注:malloc是按字节数生成的空间大小,不是按照数组长度;动态数组最后要free掉,这点和new生成后要delete的道理一致
代码实现
#include<stdio.h>
#include<stdlib.h>
#define N 10007
int main(){
int *num;
int n;
scanf("%d",&n);
num=(int *)malloc(n*sizeof(int));//动态规划数组,长度为 n
for(int i=0;i<n;i++){
if(i<2)
num[i]=1;
else
num[i]=(num[i-1]+num[i-2])%N;
}
printf("%d\n",num[n-1]);
free(num);
}
运行结果
10
55
--------------------------------
Process exited with return value 0
Press any key to continue . . .
22
7704
--------------------------------
Process exited with return value 0
Press any key to continue . . .
总结
对于此类斐波拉契数列如果是采用数组方式,则要考虑到数组的长度定义问题,可以给定一个很大范围的数组,这样未来保证数组不会越界,也可以采用
malloc
动态定义数组的长度,为了控制数据类型不会溢出,在此将每一项的的余数存放在数组里面,保证了每一项都小于N
10007
,也控制了数据范围在Int内可以得到
来源:CSDN
作者:空 白
链接:https://blog.csdn.net/qq_38496329/article/details/103480222