1. 程式人生 > >C++入門練習(一)

C++入門練習(一)

題目收集自Coursera《程式設計與演算法》課程,侵刪。

題目

晶晶赴約會

奇數求和

蘋果和蟲子

大象喝水

整數的個數

1的個數

最高的分數

奇偶排序

晶晶赴約會

注意: 總時間限制: 1000ms 記憶體限制: 65536kB

描述

晶晶的朋友貝貝約晶晶下週一起去看展覽,但晶晶每週的1、3、5有課必須上課,請幫晶晶判斷她能否接受貝貝的邀請,如果能輸出YES;如果不能則輸出NO。

輸入

輸入有一行,貝貝邀請晶晶去看展覽的日期,用數字1到7表示從星期一到星期日。

輸出

輸出有一行,如果晶晶可以接受貝貝的邀請,輸出YES,否則,輸出NO。注意YES和NO都是大寫字母!

樣例輸入:

第一組
1
第二組
2
第三組
3

樣例輸出:

第一組
NO
第二組
YES
第三組
NO

參考答案:

#include <iostream>
using namespace std;
int main() {
    int a;
    cin >> a;
    if (a == 1 || a == 3 || a == 5)
        cout << "NO" << endl;
    else
        cout << "YES" << endl;
    return 0;
}

奇數求和

注意: 總時間限制: 1000ms 記憶體限制: 65536kB

描述

計算正整數 m 到 n(包括m 和 n )之間的所有奇數的和,其中,m 不大於 n,且n 不大於300。例如 m=3, n=12, 其和則為:3+5+7+9+11=35

輸入

兩個數 m 和 n,兩個數以空格間隔,其中 0<=m <= n <= 300 。

輸出

奇數之和

樣例輸入

第一組
7 15
第二組
0 1
第三組
3 3
第四組
100 100

樣例輸出

第一組
55
第二組
1
第三組
3
第四組
0

參考答案

#include <iostream>
using namespace std;
int main() {
    int m, n, result = 0;
    cin >> m >> n;
    while (m <= n) {
        //對於m和n之間的每一個數, 如果它是奇數,那麼就加入到我們的結果裡。如果不是就跳過。
        if (m % 2 == 1)
            result += m;
        m++;
    }
    //最後輸出
    cout << result << endl;
    return 0;
}
//其實還有更快的演算法你能想到嗎?

蘋果和蟲子

注意: 總時間限制: 1000ms 記憶體限制: 65536kB

描述

你買了一箱n個蘋果,很不幸的是買完時箱子裡混進了一條蟲子。蟲子每x小時能吃掉一個蘋果,假設蟲子在吃完一個蘋果之前不會吃另一個,那麼經過y小時你還有多少個完整的蘋果?

輸入

輸入僅一行,包括n,x和y(均為整數)。

輸出

輸出也僅一行,剩下的蘋果個數

樣例輸入

第一組
10 4 9
第二組
10 4 36
第三組
10 4 100

樣例輸出

第一組
7
第二組
1
第三組
0

參考答案

#include <iostream>
using namespace std;

int main(){
	int n = 0, x = 0, y = 0;
	cin >> n >> x >> y;
	if (y / x >= n)
		cout << 0 << endl;
	else if (y % x == 0)
		cout << n - y / x << endl;
	else
		cout << n - y / x - 1 << endl;
        return 0;
}

大象喝水

注意: 總時間限制: 1000ms 記憶體限制: 65536kB

描述

一隻大象口渴了,要喝20升水才能解渴,但現在只有一個深h釐米,底面半徑為r釐米的小圓桶(h和r都是整數)。問大象至少要喝多少桶水才會解渴。

輸入

輸入有一行:包行兩個整數,以一個空格分開,分別表示小圓桶的深h和底面半徑r,單位都是釐米。

輸出

輸出一行,包含一個整數,表示大象至少要喝水的桶數。

提示

如果一個圓桶的深為h釐米,底面半徑為r釐米,那麼它最多能裝Pi * r * r * h立方厘米的水。(設Pi=3.14159)

1升 = 1000毫升

1毫升 = 1 立方厘米

樣例輸入

第一組
23 11
第二組
1 1

樣例輸出

第一組
3
第二組
6367

參考答案

#include <iostream>
using namespace std;

int main(){
	int h = 0, r = 0;
	float cap = 0;
	cin >> h >> r;
	cap = 3.14159 * r*r*h;
	cout << (int)(20000 / cap) + 1 << endl;
        return 0;
}

整數的個數

注意: 總時間限制: 1000ms 記憶體限制: 65536kB

描述

給定k(1<k<100)個正整數,其中每個數都是大於等於1,小於等於10的數。寫程式計算給定的k個正整數中,1,5和10出現的次數。

輸入

輸入有兩行:第一行包含一個正整數k,第二行包含k個正整數,每兩個正整數用一個空格分開。

輸出

輸出有三行,第一行為1出現的次數,,第二行為5出現的次數,第三行為10出現的次數。

樣例輸入

第一組
5
1 5 8 10 5
第二組
5
2 2 2 2 2

樣例輸出

第一組
1
2
1
第二組
0
0
0

參考答案

#include <iostream>
using namespace std;
int main(){
    int k;
    cin>>k;
    int n1=0, n5=0, n10=0;
    for (int i=0;i<k;i++){
        int n;
        cin>>n;
        if (n == 1) n1++;
        else if (n == 5) n5++;
        else if (n == 10) n10++;
    }
    cout<<n1<<endl;
    cout<<n5<<endl;
    cout<<n10<<endl;
    return 0;
}

1的個數

注意: 總時間限制: 1000ms 記憶體限制: 65536kB

描述

給定一個十進位制整數N,求其對應2進位制數中1的個數

輸入

第一個整數表示有N組測試資料,其後N行是對應的測試資料,每行為一個整數。

輸出

N行,每行輸出對應一個輸入。

樣例輸入

5
2
100
1000
66
0

樣例輸出

1
3
6
2
0

參考答案

# include <iostream>
using namespace std;

int main() {
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        int x, ans = 0;
        cin >> x;
        while (x > 0) {
            ans += x % 2;
            x /= 2;
        }
        cout << ans << endl;
    }
    return 0;
}
//這道題的解法就是反覆地除以2,看最低位是1還是0。有些知道位運算的同學喜歡用位運算,但其實沒必要,因為編譯器優化之後的程式其實效率是一樣的。

最高的分數

注意: 總時間限制: 1000ms 記憶體限制: 65536kB

描述

孫老師講授的《計算概論》這門課期中考試剛剛結束,他想知道考試中取得的最高分數。因為人數比較多,他覺得這件事情交給計算機來做比較方便。你能幫孫老師解決這個問題嗎?

輸入

輸入兩行,第一行為整數n(1 <= n < 100),表示參加這次考試的人數.第二行是這n個學生的成績,相鄰兩個數之間用單個空格隔開。所有成績均為0到100之間的整數。

輸出

輸出一個整數,即最高的成績。

樣例輸入

5
85 78 90 99 60

樣例輸出

99

參考答案

# include <iostream>
using namespace std;

int main() {
        int n = 0, score[100] = { 0 }, max = 0;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> score[i];
	}
	max = score[0];
	for (int i = 1; i < n; i++) {
		if (max < score[i])
			max = score[i];
	}
	cout << max << endl;
        return 0;
}

最大奇數與最小偶數之差的絕對值

注意: 總時間限制: 1000ms 記憶體限制: 65536kB

描述

輸入6個正整數,且這6個正整數中至少存在一個奇數和一個偶數。

設這6個正整數中最大的奇數為a,最小的偶數為b,求出|a-b|的值

輸入

輸入為一行,6個正整數,且6個正整數都小於100

輸入保證這6個數中至少存在一個奇數和一個偶數

輸出

輸出為一行,輸出最大的奇數與最小的偶數之差的絕對值

樣例輸入

第一組
1 2 3 4 5 6
第二組
1 6 3 8 5 10

樣例輸出

第一組
3
第二組
1

參考答案

#include <iostream>
using namespace std;

int main(){
        int nums[6] = { 0 };
	int maxOdd = 0, minEven = 100;
	for (int i = 0; i < 6; i++) {
		cin >> nums[i];
		if (nums[i] % 2 == 0 && nums[i] < minEven)
			minEven = nums[i];
		else if (nums[i] % 2 == 1 && nums[i] > maxOdd)
			maxOdd = nums[i];
	}
	cout << (maxOdd > minEven ? (maxOdd - minEven) : (minEven - maxOdd));*/
        return 0;
}

分離整數的各個數位

注意: 總時間限制: 1000ms 記憶體限制: 65536kB

描述

從鍵盤輸入一個任意的三位整數,要求正確地分離出它的百位、十位和個位數,並分別在螢幕上輸出,輸出採用每行輸出一個數的方式,不帶其它符號。

輸入

一個任意的三位整數

輸出

一個任意的三位整數

樣例輸入

123

樣例輸出

1
2
3

參考答案

#include <iostream>
using namespace std;

int main(){
        int n = 0;
	cin >> n;
	for (int i = 2; i >= 0; i--) {
		int temp = 1;
		for (int j = 0; j < i; j++)
			temp *= 10;
		cout << n / temp << endl;
		n %= temp;
	}
        return 0;
}

陣列逆序重放

注意: 總時間限制: 1000ms 記憶體限制: 65536kB

描述

將一個數組中的值按逆序重新存放。例如,原來的順序為8,6,5,4,1。要求改為1,4,5,6,8。

輸入

輸入為兩行:第一行陣列中元素的個數n(1<n<100),第二行是n個整數,每兩個整數之間用空格分隔。

輸出

輸出為一行:輸出逆序後陣列的整數,每兩個整數之間用空格分隔。

樣例輸入

5
8 6 5 4 1

樣例輸出

1 4 5 6 8

參考答案

#include <iostream>
using namespace std;
int a[100];
int main() {
    int n;
    cin >> n;
    for (int i = 0; i<n; i++)
        cin >> a[i];
    while (n--) { //常用的倒序計數迴圈,等價於while(n-->0)
        cout << a[n];
        if (n > 0) cout << " "; //如果不是最後一個數那麼就要用空格分隔開
    }
    return 0;
}
//順序輸入倒序輸出,但是如果我們要求通過修改陣列本身實現逆序重放應該怎麼做呢?

奇偶排序

注意: 總時間限制: 1000ms 記憶體限制: 65536kB

描述

輸入十個整數,將十個整數按升序排列輸出,並且奇數在前,偶數在後。

輸入:輸入十個整數

輸出:按照奇偶排序好的十個整數

樣例輸入:10 9 8 7 6 5 4 3 2 1

樣例輸出:1 3 5 7 9 2 4 6 8 10

參考答案:

方法一

#include <iostream>
    using namespace std;
    
    int main() {
      int a[10];
      for (int i = 0; i < 10; i++) {
        cin >> a[i];
      }
      // 首先,我們把奇數放到陣列左邊,偶數放到陣列右邊
      int l = 0, r = 9; //用左手和右手分別指向陣列兩端
      while (l <= r) {
        bool leftIsOdd = a[l] % 2 == 1;
        bool rightIsEven = a[r] % 2 == 0;
        if (leftIsOdd) {
          l++;
        } else if (rightIsEven) {
          r--;
        } else if (!leftIsOdd && !rightIsEven) {
          int temp = a[l];
          a[l] = a[r];
          a[r] = temp;
        }
      }
      // 對l左邊(奇數部分)冒泡,不斷比較相鄰的兩個數,如果順序錯了,那麼就交換
      int start = 0, end = l;
      for (int i = start; i < end - 1; i++) {
        for (int j = start + 1; j < start + end - i; j++) {
          if (a[j - 1] > a[j]) {
            int temp = a[j];
            a[j] = a[j - 1];
            a[j - 1] = temp;
          }
        }
      }
      // 對l右邊(偶數部分)冒泡,不斷比較相鄰的兩個數,如果順序錯了,那麼就交換
      start = l, end = 10;
      for (int i = start; i < end - 1; i++) {
        for (int j = start + 1; j < start + end - i; j++) {
          if (a[j - 1] > a[j]) {
            int temp = a[j];
            a[j] = a[j - 1];
            a[j - 1] = temp;
          }
        }
      }
      for (int i = 0; i < 10; i++) {
        cout << a[i] << ' ';
      }
      return 0;
    }

方法二:

 #include <iostream>
    using namespace std;
    
    int main() {
      int a[10];
      for (int i = 0; i < 10; i++) {
        cin >> a[i];
      }  
      // 冒泡,不斷比較相鄰的兩個數,如果順序錯了,那麼就交換
      for (int i = 0; i < 9; i++) {
        for (int j = 1; j < 10 - i; j++) {      
      // 與剛才的氣泡排序不同,我們不只是通過較數字的大小決定順序
      // 如果左邊的為偶數,右邊的為奇數,那麼順序也需要顛倒
      bool leftIsEven = a[j - 1] % 2 == 0;
      bool rightIsEven = a[j] % 2 == 0;
      if ((leftIsEven && !rightIsEven) ||
          (leftIsEven == rightIsEven && a[j - 1] > a[j])) {        
        int temp = a[j];        
        a[j] = a[j - 1];
        a[j - 1] = temp;
      }
    }
  }  
  for (int i = 0; i < 10; i++) {
    cout << a[i] << ' ';
  }  
  return 0;
}

實現氣泡排序

注意: 總時間限制: 1000ms 記憶體限制: 65536kB

描述

請根據自己的理解編寫氣泡排序演算法,陣列大小1000以內

輸入:第一行是n,表示陣列的大小,接著n行是陣列的n個元素

輸出:排序之後的結果,一個元素一行

參考答案:

    #include <iostream>
    using namespace std;

    int main() {
        int n, a[1000]; // 一共n個數,n不超過1000。a用來儲存這些數
        cin >> n;  
        // 輸入n個數  
        for (int i = 0; i < n; i++) {
          cin >> a[i];
    }  
    // 冒泡,不斷比較相鄰的兩個數,如果順序錯了,那麼就交換
    for (int i = 0; i < n - 1; i++) {
      for (int j = 1; j < n - i; j++) {      
        if (a[j - 1] > a[j]) {
          int temp = a[j];
          a[j] = a[j - 1];
          a[j - 1] = temp;
        }    
      }  
    }  
    // 依次輸出
   for (int i = 0; i < n; i++) {
     cout << a[i] << endl;  
   }  
   return 0;
}