C 练习实例11
题目:古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)
程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....,即下个月是上两个月之和(从第三个月开始)。
程序源代码:
// Created by www.runoob.com on 15/11/9.
// Copyright © 2015年 菜鸟教程. All rights reserved.
//
// 本程序打印斐波那契数列的前20项
#include <stdio.h>
int main()
{
int a = 1, b = 1, temp, i;
printf("%12d%12d", a, b); // 输出前两项
for (i = 3; i <= 20; i += 2)
{
temp = a + b; // 计算下一项
printf("%12d", temp); // 输出下一项
a = b; // 更新a
b = temp; // 更新b
temp = a + b; // 再计算下一项
printf("%12d\n", temp); // 输出并换行
a = b; // 更新a
b = temp; // 更新b
}
return 0;
}
以上实例输出结果为:
1 1 2 3
5 8 13 21
34 55 89 144
233 377 610 987
1597 2584 4181 6765
10946 17711 28657 46368
75025 121393 196418 317811
514229 832040 1346269 2178309
3524578 5702887 9227465 14930352
24157817 39088169 63245986 102334155
C 语言经典100例
冯玉玺
393***315@qq.com
参考地址
使用数组方式:
#include <stdio.h> int main() { int n[41], i; //定义 n[0] = 0; //赋值 n[1] = 1; n[2] = 1; for (i = 3; i < 41; i++) { n[i] = n[i - 1] + n[i - 2]; } printf("month\tnumber\n"); //输出 for (i = 1; i < 41; i++) { printf("%d\t%d\n", i, n[i]); } //system("pause"); }输出结果为:
冯玉玺
393***315@qq.com
参考地址
zpblog
zpb***@zpblog.cn
参考地址
递归:斐波那契数列
#include<stdio.h> int fibonaci(int i) { if(i == 0) { return 0; } if(i == 1) { return 1; } return fibonaci(i-1) + fibonaci(i-2); } int main() { int i; printf("month\tnumber\n"); for (i = 1; i < 41; i++) { printf("%d\t%d\n", i,fibonaci(i)); } return 0; }zpblog
zpb***@zpblog.cn
参考地址
小银子
101***1552@qq.com
尽量使用最少的代码,最小的内存实现。不要使用斐波那契数列递归求解,因为这样会做许多无用功
#include <stdio.h> int main() { int now =1, prev_1= 1,prev_2=0; printf("%i\n", now); for(int i = 1;i<40;i++) { now = prev_1+prev_2; printf("%i\n", now); prev_2 = prev_1; prev_1 = now; } }小银子
101***1552@qq.com
123adqe
827***724@qq.com
参考方法:
#include<stdio.h> int main() { int yt=1,et=0,st=0,zt; // 一兔 二兔 三兔 总兔 \(=_=)/ for(int t=0;t<40;t++)//(" \t=tab 一个tab三个空格") { st = et+st; // 0 0 1 1 et = (t == 0) ? 0 : yt; // 0 1 0 1 yt = (t == 0) ? 1 : st; // 1 0 1 1 zt = yt+et+st; // 1 1 2 3...... printf("%d\t月兔子有 %-10d \t 对\n",t+1,zt); } }123adqe
827***724@qq.com
学工
121***1688@qq.com
/* * 没有参考答案那么简洁,献丑分享下自己的想法。 * 因为兔子出生两个月后就可以产兔子,所以存在: * 从第3个月开始,每个前后月差值等于前两个月的前后月差值之和; * 由此可知某月兔子对数等于前一月兔子数加上前后月差值。 */ #include <stdio.h> int main() { int a1=0, a2=1, n=1, x, month; for(month=1;month<=40;month++) { if(month>2){ n=n+a2; x=a2; a2=a1+a2; a1=x; } printf("%d月的兔子总数为%d\n",month,n); } }学工
121***1688@qq.com
HIT_CCC
117***2963@qq.com
参考方法:
#include<stdio.h> int main(void) { int i; int f1 = 1; int f2 = 1; for(i = 1; i <=40; i++) { if(i == 1) printf("%12d",f1); else { f2 = f1 + f2; f1 = f2 - f1; printf("%12d",f1); } if(i%4 == 0) printf("\n"); } return 0; }HIT_CCC
117***2963@qq.com
o((>ω< ))o
131***2124@qq.com
参考:
//最简单的斐波那契(最易理解) //斐波那契的本质就是一个加一个,不断攀升,初始a,b为一,然后用c做临时变量,然后a,b分别前进就可以了(a=b,b=c) #include<stdio.h> int main(){ int a=1,b=1,c; printf("%12d%12d",1,1); for(int i=1;i<=38;i++){ c=a+b; printf("%12d",c); if(i==2||(i-2)%4==0) printf("\n"); a=b;b=c; } return 0; }o((>ω< ))o
131***2124@qq.com
大宅院里的三表哥
gul***r@outlook.com
使用公式法(本题不推荐该解法,仅作扩展):
#include <stdio.h> #include <math.h> // 编译时需要链接该库:-lm int fibonacii(int n) { if(n == 0) return 1; // 公式法解出的斐波纳契数列第一项为1/sqrt(5),四舍五入后为0 return round((pow(sqrt(5)+1, n) - pow(sqrt(5)-1, n))/sqrt(5)/pow(2, n)); } int main() { int i; for(i=1; i<=40; i++) { printf("%12d", fibonacii(i)); if(i%4 == 0) printf("\n"); } return 0; }+ 使用公式法可直接获取斐波纳契数列的特定项,而不用从第一项开始逐一求解
+ 当遇到需要求解斐波纳契数列的特定项时可使用该法
+ 参考链接:[斐波纳契数列的通项公式及证明](https://www.cnblogs.com/lzxzy-blog/p/12961585.html)
大宅院里的三表哥
gul***r@outlook.com