技术小白来报道了,第一次写这类技术博客,有点紧张....
有写的不对的地方请各位大佬指正。
求第n个斐波那契数斐波那契数前两个数都为1,其规律为后面的数字是前两个数之和。
故不难求出前几个数字,如:1,1,2,3,5,8,13,21,34,55 ……
故求第n个斐波那契数可用循环来实现。
第一步:定义前两个数字1,来满足求接下来数的需要。
第二步:定义要求的数n,通过scanf来输入n的值。
第三步:根据其规律:从第三个数字开始,后一个数字为前两个数字之和。编码循环内的内容。
第四步:打印出所求的斐波那契数。
循环内该如何实现所求的值?
引入num1 = 1,num2 = 1;(为前两个数字)
要实现第三个数是前两个数之和,可以引入一个变量m,令m等于前两个数之和,故m为第三个数。此时要求第四个数,既要将第二个数和第三个数相加。
故:在求完第三个数字时,令num1 = num2, num2 = m; 此时可以使第一个数字和第二个数字转换成第二个数字和第三个数字。当然,此时的m还表示为第三个数字,故不影响我们所要求的结果。
进而,是循环几次的问题,由于已知两个数,故在循环时需要将循环次数减2,如下的for循环。
int i = 0; 从0开始,在i小于n-2时执行循环,执行一次i++。
根据这个思路可以解决这个问题。
代码如下:
#include//斐波那契数 //求第n个斐波那契数 int main() { int num1 = 1, num2 = 1; int n = 0; printf("请输入你想求的第n个斐波那契数:"); scanf("%d", &n); int i = 0; int m = 0 ; printf("%d %d ", num1, num2); for (i=0 ; i < n-2 ; i++) { m = num1 + num2; num1 = num2; num2 = m; printf("%d ", m); } printf("n"); printf("第%d个斐波那契数是%dn", n, m); return 0; }
同样,也可以利用递归方法来实现,但存在的问题是,递归效率太低。
同样的思路,只不过更换成函数调用。代码如下:
#includeint count; int Fab(int n) { if (n == 3) count++;//统计计算机求第三个斐波那契数的次数! if (n <= 2) return 1; else return(Fab(n - 1) + Fab(n - 2)); } int main() { int n; scanf("%d", &n); int m = Fab(n); printf("%dn", m); printf("count=%dn", count); return 0; }
谢谢大佬们观看!!!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)