C 练习实例11
题目:古典问题(兔子生崽):有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?(输出前40个月即可)
程序分析:兔子的规律为数列1,1,2,3,5,8,13,21....,即下个月是上两个月之和(从第三个月开始)。
程序源代码:
// Created by www.facesoho.com on 15/11/9.
// Copyright © 2015年 小鸟启蒙. All rights reserved.
//
#include<stdio.h>
int main()
{
int f1=1,f2=1,i;
for(i=1;i<=20;i++)
{
printf("%12d%12d",f1,f2);
if(i%2==0) printf("\n");
f1=f1+f2;
f2=f1+f2;
}
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

文人墨客
参考方法:
#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; }文人墨客
/* * 没有参考答案那么简洁,献丑分享下自己的想法。 * 因为兔子出生两个月后就可以产兔子,所以存在: * 从第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); } }文人墨客
参考方法:
#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); } }文人墨客
尽量使用最少的代码,最小的内存实现。不要使用斐波那契数列递归求解,因为这样会做许多无用功
#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; } }文人墨客
递归:斐波那契数列
#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; }文人墨客
使用数组方式:
#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"); }输出结果为: