Fibonacc数列Fn取余——算法

别等时光非礼了梦想. 提交于 2019-12-10 18:46:14

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内可以得到

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!