目录
  1. 1. Fibonacc数列Fn项取余
    1. 1.1. 题目描述
    2. 1.2. 题目分析
    3. 1.3. 代码实现
    4. 1.4. 运行结果
    5. 1.5. 总结
Fibonacc数列Fn取余

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

文章作者: Jachie Xie
文章链接: https://xjc5772.github.io/2019-12/10/%E7%AE%97%E6%B3%95/Fibonacc%E6%95%B0%E5%88%97Fn%E5%8F%96%E4%BD%99/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 XJC&Blog
打赏
  • 微信
  • 支付宝

评论