首先我将书上的六个例题都看了一遍,读懂意思以后也都敲了一遍
(题目来:JLO이2337)
1.问题描述
【Description】
这是一个有趣的古典数学问题,著名意大利数学家 Fibonacci曾提出一个问题:有一对
小兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生
对兔子。按此规律,假设兔子没有死亡,第一个月有一对刚出生的小兔子,问第n个月有
多少对兔子?
【Input】
输入月数n(1≤n≤45)。
【output】
输出第n个月有多少对兔子。
【Sample Input】
6
【Sample Output】
8
解析:感觉这个兔子繁殖问题和斐波那契数列一样,说的很厉害的样子,但是真的计算起来和斐波那契数列的计算过程也是一样的。
代码:
1 #include <stdio.h>
2 //兔子繁殖(斐波那契数列)
3 int main(void) 4 { 5 int n,b=1,d=1,z,i; 6 scanf("%d",&n); 7 for (i = 3; i < n; i++) 8 { 9 z=d; 10 d=b+d; 11 b=z; 12 } 13 printf("%d\n",d ); 14 return 0; 15 }
(题目来源:JLOJ2338)
1.问题描述
【 Description】
任意给两个正整数m和n,求它们的最大公约数。
【input】
输入两个正整数m和m。
【 Output】
输出m和n的最大公约数。
【Sample Input】
12 18
【Sample Output】
6
解析:这个好像利用到了高中学习的辗转相除法,在这段代码里面我写了g(公)b(倍)s(数)的函数,先把两个数的大小比较出来,然后在被除数不为零的前提下一直取余,最终等到y为零以后返回x这个最大公倍数。
代码:
1 #include <stdio.h> 2 //最大公倍数 3 int gbs(int x,int y); 4 5 int main(void) 6 { 7 int a,b,z; 8 scanf("%d%d",&a,&b); 9 z=gbs(a,b); 10 printf("%d\n",z ); 11 return 0; 12 } 13 14 int gbs(int x,int y) 15 { 16 int m; 17 if (x<y) 18 { 19 m=x; 20 x=y; 21 y=m; 22 } 23 while(y>0){ 24 m=x%y; 25 x=y; 26 y=m; 27 } 28 return x; 29 }
这一部分是课后的习题啦
3.3.1求年龄
(题目源:LO2416)
【Description】
有n个人围坐在一起,当问第n个人的年龄时,他说比第n-1个人大2岁。问第n-1
个人的年龄时,他说比第m-2个人大2岁。向第n-2个人时,他又说比第n-3个人大2
岁……最后问到第一个人时,他说是10岁。请问第n个人的年龄?
【Input】
输入一个正整数n(n<40)。
【 Output】
输出第n个人的年龄。
【Sample Input】
5
【Sample Output】
18
分析:这道题就是由第一个递加,加到了第n个,这没什么好说的
代码:
1 #include <stdio.h>
2 //3.3.1 求年龄
3
4 int main(void) 5 { 6 int n,a=10,i; 7 scanf("%d",&n); 8 for (i = 1; i < n; i++) 9 { 10 a=a+2; 11 } 12 printf("%d\n",a); 13 return 0; 14 }
运行结果:
(题目来源:JLO2417)
【Description】
求斐波那契数列的前n项之和。
【input】
输入一个正整数n(0<n<100)。
【 Output】
输出前n项的和。
【Sample Input】
5
【Sample Output】
12
代码:
1 #include <stdio.h>
2 //3.3.2 斐波那契数列求和
3
4 int main(void) 5 { 6 int a[101],i,sum,n; 7 a[1]=1; 8 a[2]=1; 9 sum=0; 10 scanf("%d",&n); 11 for (i = 3; i < 101; i++) 12 { 13 a[i]=a[i-1]+a[i-2]; 14 } 15 for (i = 1; i <= n; i++) 16 { 17 sum+=a[i]; 18 } 19 printf("%d\n",sum); 20 return 0; 21 }
(题目来源:JLOJ2418)
【 Description】
从原点出发,一步只能向右走、向上走或向左走,每步都只能走一个单位长度。恰
走N步且不经过已走的点共有多少种走法?
【Input】
每行一个整数N,代表步数,0<Nk20。
【 Output】
输出共有多少种走法。
【Sample Input】
3
【Sample Output】
10
代码:
1 #include <stdio.h>
2 //3.3.3 决不后退
3
4 int main(void) 5 { 6 int a[20],n,i; 7 a[1]=3; 8 a[2]=7; 9 scanf("%d",&n); 10 for (i = 3; i <= n; i++) 11 { 12 a[i]=a[i-2]+a[i-1]*2; 13 } 14 printf("%d\n",a[n]); 15 return 0; 16 }
运行结果:
3.3.4取数
(题目来:JLO]2419)
【 Description】
自然数从1到N按照顺序排成一排,可以从中取走任意数,但是相邻的两个数不可以
司时被取走。一共有多少种取法?
【Input】
输入一个正整数N(N<20)。
【 Output】
输出取数的取法总数。
【 Sample Input】
15
【 Sample Output】
1596
分析:这个我先一个一个在本子上面列举了,我感觉有些像斐波那契数列,但是我列举的情况总是比斐波那契数列的值少一。
代码:
1 #include <stdio.h> 2 //取数 3 4 int main(void) 5 { 6 int a[21],n,i,b; 7 a[1]=2; 8 a[2]=3; 9 scanf("%d",&n); 10 for (i = 3; i<20; i++) 11 { 12 a[i]=a[i-2]+a[i-1]; 13 } 14 b=a[n]-1; 15 printf("%d\n",b); 16 return 0; 17 }
运行结果: