2018/11/19--2018/11/26周學習內容
首先我將書上的六個例題都看了一遍,讀懂意思以後也都敲了一遍
3.2.1免子繁殖問題
(題目來: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 }
執行結果:
3.3.2斐波那契數列求和
(題目來源:JLO2417)
【Description】
求斐波那契數列的前n項之和。
【input】
輸入一個正整數n(0<n<100)。
【 Output】
輸出前n項的和。
【Sample Input】
5
【Sample Output】
12
分析:斐波那契數列我寫過很多次了,有用遞迴的方法還有用非遞迴的方法寫過。這次是用遞推方法寫的,我利用了一個for迴圈來把前一百個資料存進了數組裡,然後又利用一個for迴圈把前n項資料都加到了sum裡面。
程式碼:
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 }
執行結果:
3.3.3絕不後退
(題目來源: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 }
執行結果: