常用自定义函数总结

交换函数

#include <iostream>
using namespace std;

// 1. 值传递:无法交换外部变量
void swap_value(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    // 函数内交换了形参,但对外部实参无影响
}

// 2. 引用传递:可以直接交换外部变量
void swap_reference(int &a, int &b) {
    int temp = a;
    a = b;
    b = temp;
}

// 3. 地址传递:通过指针交换外部变量
void swap_pointer(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

int main() {
    int x = 5, y = 10;
    // 值传递
    swap_value(x, y);
    // 引用传递
    swap_reference(x, y);
    // 地址传递
    swap_pointer(&x, &y);
    return 0;
}

进制转换

十进制转二进制

string decToBin(int n) {
    if (n == 0) return "0";
    string res = "";
    while (n > 0) {
        res += (n % 2) + '0';
        n /= 2;
    }
    reverse(res.begin(), res.end());
    return res;
}

二进制转十进制

int binToDec(string bin) {
    int res = 0;
    for (char ch : bin) {
        res = res * 2 + (ch - '0');
    }
    return res;
}
int binToDec(string bin) {
    int res = 0;
    int base = 1;                     // 2^0
    for (int i = bin.length() - 1; i >= 0; i--) {
        if (bin[i] == '1')
            res += base;
        base *= 2;                    // 下一位权重乘2
    }
    return res;
}

十进制转R进制

string decToBase(int n, int R) {
    if (n == 0) return "0";
    string res = "";
    bool negative = false;
    if (n < 0) {
        negative = true;
        n = -n;
    }
    while (n > 0) {
        int remainder = n % R;
        if (remainder < 10) {
            res += remainder + '0';
        } else {
            res += (remainder - 10) + 'A';
        }
        n /= R;
    }
    if (negative) res += '-';
    reverse(res.begin(), res.end());
    return res;
}

R进制转十进制

int baseToDec(string s, int R) {
    int res = 0;
    int start = 0;
    bool negative = false;
    string str = s;
    if (str[0] == '-') {
        negative = true;
        start = 1;
    }
    for (int i = start; i < str.length(); i++) {
        char ch = toupper(str[i]);
        int digit;
        if (ch >= '0' && ch <= '9') {
            digit = ch - '0';
        } else {
            digit = ch - 'A' + 10;
        }
        res = res * R + digit;
    }
    return negative ? -res : res;
}

数据处理

判断质数(素数)

// 基础版
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;
}
// 优化版
bool isPrime1(int n) {
    if (n <= 1) return false;
    if (n == 2) return true;
    if (n % 2 == 0) return false;
    for (int i = 3; i * i <= n; i += 2) {
        if (n % i == 0) return false;
    }
    return true;
}
// 更优版
bool isPrime2(int n) {
    if (n <= 1) return false;
    if (n <= 3) return true;   // 2,3 是质数
    if (n % 2 == 0 || n % 3 == 0) return false;
    // 所有质数都可表示为 6k±1
    for (int i = 5; i * i <= n; i += 6) {
        if (n % i == 0 || n % (i + 2) == 0) return false;
    }
    return true;
}

判断回文数

// 优化版
bool isPalindrome(const string& s) {
    int left = 0, right = s.length() - 1;
    while (left < right) {
        if (s[left] != s[right]) return false;
        left++;
        right--;
    }
    return true;
}
// 简易版
bool isPalindrome(string s) {
    string rev = s;
    reverse(rev.begin(), rev.end());
    return s == rev;
}
// 数字版
bool isPalindrome(int n) {
    // 负数直接不是回文(若认为-121不是回文,通常按题意)
    if (n < 0) return false;
    int original = n;
    int reversed = 0;
    while (n > 0) {
        reversed = reversed * 10 + n % 10;
        n /= 10;
    }
    return original == reversed;
}

数字倒序

实际处理过程中,还需要注意数据正负以及前导零情况,灵活运用字符串与整数之间的转换函数以及reverse反转函数

// 字符串倒序
string reverseString(string s) {
    string res = s;
    int left = 0, right = res.length() - 1;
    while (left < right) {
        swap(res[left], res[right]);
        left++;
        right--;
    }
    return res;
}
// 数字倒序
int reverseNumber(int n) {
    bool negative = false;
    if (n < 0) {
        negative = true;
        n = -n;
    }
    int reversed = 0;
    while (n > 0) {
        reversed = reversed * 10 + n % 10;
        n /= 10;
    }
    return negative ? -reversed : reversed;
}