CSP-J/S IS COMING

CSP-J/S IS COMING

又到了一年一度的CSP时节了,在这一年,我要报考CSP-J和CSP-S两个考试,希望自己能过吧!不过重点准备的还是CSP-J,希望能出一个好成绩(毕竟历年我的CSP-J复赛都失误了)。现在重点在于准备CSP-J/S的初赛。

今天主要是给大家看阅读程序部分:

接下来的代码块中展示了CSP-J的阅读程序各种算法

CSP-J阅读程序基础算法

复制代码
```cpp
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

// 一、基础运算与模拟类

// 1. 数值统计:统计1~n中能被3整除但不能被5整除的数的个数
int countSpecialNumbers(int n) {
    int count = 0;
    for (int i = 1; i <= n; ++i) {
        if (i % 3 == 0 && i % 5 != 0) {
            count++;
        }
    }
    return count;
}

// 2. 数学计算:计算1! + 2! + ... + n!
long long sumFactorials(int n) {
    long long total = 0;
    long long fact = 1;
    for (int i = 1; i <= n; ++i) {
        fact *= i;
        total += fact;
    }
    return total;
}

// 3. 字符串处理:统计字符串中大写字母的个数
int countUpperCase(const string &s) {
    int count = 0;
    for (char c : s) {
        if (c >= 'A' && c <= 'Z') {
            count++;
        }
    }
    return count;
}


// 二、枚举与暴力搜索类

// 1. 寻找完数(完全数):一个数等于它的所有真因子之和
bool isPerfectNumber(int num) {
    if (num <= 1) return false;
    int sum = 1; // 1是所有大于1的数的真因子
    for (int i = 2; i * i <= num; ++i) {
        if (num % i == 0) {
            sum += i;
            if (i != num / i) {
                sum += num / i;
            }
        }
    }
    return sum == num;
}

// 2. 寻找水仙花数(三位数,各位数字的立方和等于该数本身)
bool isNarcissisticNumber(int num) {
    if (num < 100 || num > 999) return false;
    int a = num / 100;       // 百位
    int b = (num / 10) % 10; // 十位
    int c = num % 10;        // 个位
    return a*a*a + b*b*b + c*c*c == num;
}

// 3. 枚举法求最大公约数
int gcdByEnumeration(int a, int b) {
    int minVal = min(a, b);
    for (int i = minVal; i >= 1; --i) {
        if (a % i == 0 && b % i == 0) {
            return i;
        }
    }
    return 1;
}


// 三、前缀和与差分

// 1. 前缀和:计算区间[l, r]的和(1-based索引)
int rangeSum(const vector<int> &arr, int l, int r) {
    int n = arr.size();
    vector<int> pre(n + 1, 0);
    for (int i = 1; i <= n; ++i) {
        pre[i] = pre[i - 1] + arr[i - 1]; // arr是0-based,pre是1-based
    }
    return pre[r] - pre[l - 1];
}

// 2. 差分:对区间[l, r]加val,然后还原数组(1-based索引)
vector<int> rangeAdd(const vector<int> &arr, int l, int r, int val) {
    int n = arr.size();
    vector<int> diff(n + 2, 0); // 多开两个位置避免越界
    
    // 初始化差分数组
    for (int i = 1; i <= n; ++i) {
        diff[i] = arr[i - 1];
        if (i > 1) {
            diff[i] -= arr[i - 2];
        }
    }
    
    // 区间更新
    diff[l] += val;
    if (r + 1 <= n) {
        diff[r + 1] -= val;
    }
    
    // 还原数组
    vector<int> res(n);
    res[0] = diff[1];
    for (int i = 2; i <= n; ++i) {
        res[i - 1] = res[i - 2] + diff[i];
    }
    return res;
}


// 四、排序与查找

// 1. 冒泡排序
void bubbleSort(vector<int> &arr) {
    int n = arr.size();
    for (int i = 0; i < n - 1; ++i) {
        for (int j = 0; j < n - 1 - i; ++j) {
            if (arr[j] > arr[j + 1]) {
                swap(arr[j], arr[j + 1]);
            }
        }
    }
}

// 2. 选择排序
void selectionSort(vector<int> &arr) {
    int n = arr.size();
    for (int i = 0; i < n - 1; ++i) {
        int minIdx = i;
        for (int j = i + 1; j < n; ++j) {
            if (arr[j] < arr[minIdx]) {
                minIdx = j;
            }
        }
        swap(arr[i], arr[minIdx]);
    }
}

// 3. 二分查找(查找目标值是否存在,返回索引,-1表示不存在)
int binarySearch(const vector<int> &arr, int target) {
    int left = 0, right = arr.size() - 1;
    while (left <= right) {
        int mid = left + (right - left) / 2; // 避免溢出
        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] < target) {
            left = mid + 1;
        } else {
            right = mid - 1;
        }
    }
    return -1;
}


// 五、递推与递归

// 1. 斐波那契数列(递推版):f(n) = f(n-1) + f(n-2),f(1)=f(2)=1
long long fibonacciIterative(int n) {
    if (n <= 2) return 1;
    long long a = 1, b = 1, c;
    for (int i = 3; i <= n; ++i) {
        c = a + b;
        a = b;
        b = c;
    }
    return b;
}

// 2. 斐波那契数列(递归版)
long long fibonacciRecursive(int n) {
    if (n <= 2) return 1;
    return fibonacciRecursive(n - 1) + fibonacciRecursive(n - 2);
}

// 3. 阶乘(递归版)
long long factorialRecursive(int n) {
    if (n == 0 || n == 1) return 1;
    return n * factorialRecursive(n - 1);
}

// 4. 组合数(递推版,杨辉三角)
int combination(int n, int k) {
    if (k < 0 || k > n) return 0;
    if (k == 0 || k == n) return 1;
    vector<vector<int>> C(n + 1, vector<int>(k + 1, 0));
    for (int i = 1; i <= n; ++i) {
        C[i][0] = 1;
        for (int j = 1; j <= min(i, k); ++j) {
            C[i][j] = C[i - 1][j - 1] + C[i - 1][j];
        }
    }
    return C[n][k];
}


// 六、其他高频算法

// 1. 辗转相除法求最大公约数
int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

// 2. 求最小公倍数
int lcm(int a, int b) {
    return a / gcd(a, b) * b; // 先除后乘避免溢出
}

// 3. 十进制转二进制(字符串形式)
string decimalToBinary(int num) {
    if (num == 0) return "0";
    string binary = "";
    bool isNegative = false;
    if (num < 0) {
        isNegative = true;
        num = -num;
    }
    while (num > 0) {
        binary = (num % 2 == 0 ? "0" : "1") + binary;
        num /= 2;
    }
    return isNegative ? "-" + binary : binary;
}

// 4. 二进制转十进制
int binaryToDecimal(const string &binary) {
    int decimal = 0;
    bool isNegative = false;
    int start = 0;
    if (binary[0] == '-') {
        isNegative = true;
        start = 1;
    }
    for (int i = start; i < binary.size(); ++i) {
        decimal = decimal * 2 + (binary[i] - '0');
    }
    return isNegative ? -decimal : decimal;
}

// 5. 贪心算法:找零钱(用尽量少的硬币)
int makeChange(int amount, const vector<int> &coins) {
    // 假设coins已按从大到小排序
    int count = 0;
    for (int coin : coins) {
        while (amount >= coin) {
            amount -= coin;
            count++;
        }
        if (amount == 0) break;
    }
    return amount == 0 ? count : -1; // -1表示无法找零
}

int main() {
    //执行操作
    return 0;
}

感谢大家的关注与支持,博主继续努力的!!!

相关推荐
Armyyyyy丶3 小时前
Redis底层实现原理之五大基础结构
数据结构·redis·缓存
蕓晨3 小时前
set的插入和pair的用法
c++·算法
THMAIL4 小时前
深度学习从入门到精通 - AutoML与神经网络搜索(NAS):自动化模型设计未来
人工智能·python·深度学习·神经网络·算法·机器学习·逻辑回归
金古圣人4 小时前
hot100 滑动窗口
数据结构·c++·算法·leetcode·哈希算法
kebeiovo4 小时前
算法-二叉树的序列化与反序列化
算法
蒹葭玉树4 小时前
【C++上岸】C++常见面试题目--算法篇(第二十期)
c++·算法·面试
JJJJ_iii4 小时前
【左程云算法03】对数器&算法和数据结构大致分类
数据结构·算法·分类
轮到我狗叫了4 小时前
牛客.小红的子串牛客.kotori和抽卡牛客.循环汉诺塔牛客.ruby和薯条
java·开发语言·算法
高山有多高5 小时前
详解文件操作
c语言·开发语言·数据库·c++·算法