|
【C语言】入门训练 Fibonacci数列 |
一派護法 十九級 |
问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。 输入格式 输入包含一个整数n。 输出格式 输出一行,包含一个整数,表示Fn除以10007的余数。
说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。 样例输入 10 样例输出 55 样例输入 22 样例输出 7704 数据规模与约定 1 <= n <= 1,000,000。
锦囊1
使用数组来保存F序列,只保存除10007的余数。
锦囊2
先令F[1]=1, F[2]=1,然后用F[i]=(F[i-1]+F[i-2])%10007来计算F[i]。
|
一派護法 十九級 |
错误的答案: #include <stdio.h>
//这是老师上课讲的递归法。。。 int F(int n) { if (n <= 2) return 1; else return F(n - 1) + F(n - 2); }
int main() { int n; int reminder; scanf("%d", &n); reminder = F(n) % 10007; printf("%d\n", reminder); return 0; }
评测结果 运行超时 得分 30
CPU使用 运行超时
内存使用 62.62MB
|
一派護法 十九級 |
正确的答案: #include <stdio.h>
int main() { int n, i; int F[3] = {1, 1, 1}; scanf("%d", &n); if (n >= 3) { for (i = 3; i <= n; i++) { F[2] = (F[1] + F[0]) % 10007; F[0] = F[1]; F[1] = F[2]; } } printf("%d\n", F[2]); return 0; }
评测结果 正确 得分 100
CPU使用 0ms
内存使用 1.597MB
|
一派護法 十九級 |
递归法写出的函数虽然简单,但是很耗系统资源。
|
一派護法 十九級 |
输入:1000000 输出:114
-------------------------------- Process exited after 11.82 seconds with return value 0 Press any key to continue . . .
|
一派護法 十九級 |
2楼的程序,即便是输入50,都无法得出计算结果。不过输入40的话: 40 2573
-------------------------------- Process exited after 2.181 seconds with return value 0 Press any key to continue . . .
|
一派護法 十九級 |
其实,应该不需要判断n>=3: #include <stdio.h> #include <stdlib.h>
int main() { int n, i; int F[3] = {1, 1, 1}; scanf_s("%d", &n); for (i = 3; i <= n; i++) { F[2] = (F[0] + F[1]) % 10007; F[0] = F[1]; F[1] = F[2]; } printf("%d\n", F[2]); system("pause"); return 0; }
|
一派護法 十九級 |
仍然是前两个数相加得到新数,只不过数组只存储三个元素,且都是存储的都是余数。
|