1. 程式人生 > >2018/11/19--2018/11/26周學習內容

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 }

 

3.2.2最大公約數問題
(題目來源: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 }

 

執行結果: