交换函数
#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;
}
