C++信奥赛专题

应用题示例

应用题 1: 找出数组中的最大值

题目
编写一个函数,该函数接受一个整数数组作为输入,并返回数组中的最大值。

答案

#include <iostream>  
#include <vector>  
#include <algorithm> // 用于 std::max_element  
  
int findMaxInArray(const std::vector<int>& arr) {  
    if (arr.empty()) {  
        throw std::invalid_argument("数组不能为空");  
    }  
    return *std::max_element(arr.begin(), arr.end());  
}  
  
int main() {  
    std::vector<int> numbers = {4, 2, 9, 7, 5, 1};  
    try {  
        int maxNum = findMaxInArray(numbers);  
        std::cout << "数组中的最大值是:" << maxNum << std::endl;  
    } catch (const std::invalid_argument& e) {  
        std::cout << e.what() << std::endl;  
    }  
    return 0;  
}

应用题 2: 字符串反转

题目
编写一个函数,该函数接受一个字符串作为输入,并返回反转后的字符串。

答案

#include <iostream>  
#include <string>  
#include <algorithm> // 用于 std::reverse  
  
std::string reverseString(std::string str) {  
    std::reverse(str.begin(), str.end());  
    return str;  
}  
  
int main() {  
    std::string original = "hello";  
    std::string reversed = reverseString(original);  
    std::cout << "反转后的字符串是:" << reversed << std::endl;  
    return 0;  
}

应用题 3: 斐波那契数列

题目
编写一个函数,该函数接受一个整数 n 作为输入,并返回斐波那契数列中的第 n 个数。斐波那契数列的定义是:F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n > 1)。

答案

#include <iostream>  
  
int fibonacci(int n) {  
    if (n <= 1) {  
        return n;  
    }  
    int a = 0, b = 1, c;  
    for (int i = 2; i <= n; ++i) {  
        c = a + b;  
        a = b;  
        b = c;  
    }  
    return b;  
}  
  
int main() {  
    int n = 10;  
    std::cout << "斐波那契数列中的第 " << n << " 个数是:" << fibonacci(n) << std::endl;  
    return 0;  
}

应用题 4: 冒泡排序

题目
实现冒泡排序算法,对一个整数数组进行排序。

答案

#include <iostream>  
#include <vector>  
  
void bubbleSort(std::vector<int>& arr) {  
    int n = arr.size();  
    for (int i = 0; i < n-1; i++) {  
        for (int j = 0; j < n-i-1; j++) {  
            if (arr[j] > arr[j+1]) {  
                // 交换 arr[j] 和 arr[j+1]  
                std::swap(arr[j], arr[j+1]);  
            }  
        }  
    }  
}  
  
int main() {  
    std::vector<int> numbers = {64, 34, 25, 12, 22, 11, 90};  
    bubbleSort(numbers);  
    std::cout << "排序后的数组是:";  
    for (int num : numbers) {  
        std::cout << num << " ";  
    }  
    std::cout << std::endl;  
    return 0;  
}

应用题 5: 圆的面积(C++)

题目
已知一个圆的半径为5,求该圆的面积。

代码示例答案

#include <iostream>  
#include <cmath> // 用于math.h库中的常量PI  
  
using namespace std;  
  
int main() {  
    const double PI = 3.14159; // 圆周率π  
    double radius = 5.0; // 半径  
  
    // 计算面积  
    double area = PI * radius * radius;  
  
    // 输出结果  
    cout << "该圆的面积为:" << area << endl;  
  
    return 0;  
}

应用题6. 最大公约数

题目:给定两个正整数a和b,求它们的最大公约数。

#include <iostream>  
using namespace std;  
  
int gcd(int a, int b) {  
    return b == 0 ? a : gcd(b, a % b);  
}  
  
int main() {  
    int a, b;  
    cin >> a >> b;  
    cout << gcd(a, b) << endl;  
    return 0;  
}

应用题7. 素数判定

题目:判断一个正整数是否为素数。

#include <iostream>  
using namespace std;  
  
bool isPrime(int n) {  
    if (n <= 1) return false;  
    for (int i = 2; i * i <= n; ++i) {  
        if (n % i == 0) return false;  
    }  
    return true;  
}  
  
int main() {  
    int n;  
    cin >> n;  
    if (isPrime(n)) cout << n << " 是素数" << endl;  
    else cout << n << " 不是素数" << endl;  
    return 0;  
}

应用题8. 冒泡排序

题目:使用冒泡排序算法对给定的整数数组进行排序。

#include <iostream>  
using namespace std;  
  
void bubbleSort(int arr[], int n) {  
    for (int i = 0; i < n - 1; ++i) {  
        for (int j = 0; j < n - i - 1; ++j) {  
            if (arr[j] > arr[j + 1]) {  
                swap(arr[j], arr[j + 1]);  
            }  
        }  
    }  
}  
  
int main() {  
    int n;  
    cin >> n;  
    int arr[n];  
    for (int i = 0; i < n; ++i) cin >> arr[i];  
    bubbleSort(arr, n);  
    for (int i = 0; i < n; ++i) cout << arr[i] << " ";  
    cout << endl;  
    return 0;  
}
0.052199s