// 判断 闰年
bool leapyear(int year) {
/*
if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
return true;
} else {
return false;
}
*/
return !(year % 400) || !(year % 4) && year % 100;
}
// 成绩等级
char grade(int score) {
char grade;
if (score >= 90) {
grade = 'A';
} else if (score >= 80) {
grade = 'B';
} else if (score >= 70) {
grade = 'C';
} else if (score >= 60) {
grade = 'D';
} else {
grade = 'E';
}
return grade;
}
背下来了,厉害!!!
// 判断 素数
bool prime(int n) {
bool isPrime = true;
if (n < 2) {
isPrime = false;
} else {
int nn = sqrt(n);
for (int i = 2; i <= nn; i++) {
if (n % i == 0) {
isPrime = false;
break;
}
}
}
return isPrime;
}
// 埃氏筛法求区间素数
void prime_zone(int n) {
bool arr[10000 + 1];
memset(arr, true, sizeof(arr));
int nn = sqrt(n);
for (int i = 2; i <= nn; i++) {
if (arr[i]) {
for (int j = 2; i * j <= n; j++) {
arr[i * j] = false;
}
}
}
for (int i = 2; i <= n; i++) {
if (arr[i]) {
cout << i << " ";
}
}
cout << endl;
}
// 辗转相除法求最大公约数
int gcd (int a, int b) {
/*
// 循环转移方法
if (a < b) swap(a, b);
int c = a % b;
while (c != 0) {
a = b;
b = c;
c = a % b;
}
return b;
*/
// 递归转移方法
return (b == 0) ? a : gcd(b, a % b);
}
// 求最小公倍数
int lcm(int a, int b) {
/*
// 剪枝枚举方法
int ans = 0;
if (a > b) swap(a, b);
for (int i = 1; i <= a; i++) {
if (b * i % a == 0) {
ans = b * i;
break;
}
}
return ans;
*/
// 借助 gcd(a, b) 高效求法
return (a * b) / gcd(a, b);
}
// 判断回文数
bool hw_number(int n) {
int nn = n, reverse = 0, num;
do {
num = nn % 10;
reverse = reverse * 10 + num;
nn = nn / 10;
} while (nn > 0);
return (n == reverse);
加油,你已成功一半!!!
}
// 判断回文串(字符数组)
bool hw_string(char arr[]) {
bool flag = true;
int len = strlen(arr);
for (int i = 0; i < len / 2; ++i) {
if (arr[i] != arr[len - 1 - i]) {
flag = false;
break;
}
}
return flag;
}
// 判断回文串(字符串类)
bool hw_string(string s) {
/*
// 首位对称字符判断方式 O(n/2)
bool flag = true;
int sz = s.size();
for (int i = 0; i < sz / 2; ++i) {
if (s[i] != s[sz - 1 - i]) {
flag = false;
break;
}
}
return flag;
*/
// 翻转字符串判断方式 O(n/2)
string ss = s;
reverse(ss.begin(), ss.end());
return s == ss;
}
// 分解质因数
void prime_factor(int n) {
cout << n << "=";
for (int i = 2; i <= n / i; i++) { // 注意遍历范围是 2 ~ sqrt(n)
while (n % i == 0 && n != i) { // 最后一个不输出 n / i != 1
cout << i << "*";
n /= i;
}
}
cout << n << endl; // 补充输出剩余部分
}
// 同余方程
// (a + b) mod c = (a mod c + b mod c) mod c
// (a * b) mod c = ((a mod c) * (b mod c)) mod c
// (a * a) mod c = ((a mod c) * (a mod c)) mod c
// 同余方程求阶乘之和
long long fac_sum(int n) {
long long sum = 0, num = 1; // 阶乘和 、阶乘值
for (int i = 1; i <= n; i++) { // 优化算法(一重循环)
num = num * i % 1000000; // 阶乘不重置 1,继续累乘
sum = (sum + num) % 1000000; // 累加阶乘和 取模
}
return sum;
}
// 进制转换
void number_system_func() {
/*
// itoa 和 atoi 是 非标准 库函数,比赛中不可使用!!!
// 整数 转 字符数组 (int 范围 有效)
int n = 1234;
itoa(n, arr, 10); // 转换为 十进制 数字 字符数组
cout << arr << endl;
itoa(n, arr, 2); // 转换为 二进制 数字 字符数组
cout << arr << endl;
itoa(n, arr, 8); // 转换为 八进制 数字 字符数组
cout << arr << endl;
itoa(n, arr, 16); // 转换为 十六进制 数字 字符数组
cout << arr << endl;
// 字符数组 转 整数 (int 范围 有效)
strcpy(arr, "5678");
cout << atoi(arr) << endl;
cout << atoi(arr) + atoi(arr) << endl;
// 字符数组 转 浮点数 (float 范围 有效)
strcpy(arr, "123.45");
cout << atof(arr) << endl;
cout << atof(arr) + atof(arr) << endl;
*/
// 以下 数值转换 的方法可以正常使用
// 用 二进制、八进制、十六进制 给变量赋值
int num = 0b10100; // 二进制 赋值
cout << num << endl;
num = 024; // 八进制 赋值
cout << num << endl;
num = 0x14; // 十六进制 赋值
cout << num << endl;
int n = 20;
char arr[1000 + 1];
memset(arr, 0, sizeof(arr));
string str;
// 整数 转换 二进制 字符串 (方法一)
int nn = n, i = 0;
while (nn > 0) {
arr[i++] = nn % 2 + '0';
nn = nn / 2;
}
reverse(arr, arr + strlen(arr));
cout << arr << endl;
// 整数 转换 二进制 字符串 (方法二)
str = bitset<sizeof(n) * 8>(n).to_string();
cout << str << endl;
// 整数 转换 八进制 字符串
sprintf(arr, "%o", n);
cout << arr << endl;
// 整数 转换 十六进制 字符串
sprintf(arr, "%x", n);
cout << arr << endl;
// 整数 或 浮点数 转换成 字符串
int n5 = 1234567890;
str = to_string(n5);
cout << str << endl;
long long ll5 = 123456789012345678;
str = to_string(ll5);
cout << str << endl;
double f5 = 1234567890.12345;
str = to_string(f5);
cout << str << endl;
可以背到这,厉害!!!
// 从 字符串 转换成 整型和浮点型 (包括 十进制,八进制,十六进制)
str = "123456789";
cout << stoi(str) << endl;
cout << stoi(str, 0, 10) << endl; // 十进制 字符 转换 十进制 整数
str = "10";
cout << stoi(str, 0, 8) << endl; // 八进制 字符 转换 十进制 整数
str = "10";
cout << stoi(str, 0, 16) << endl; // 十六进制 字符 转换 十进制 整数
str = "123456789012345678";
cout << stoll(str) << endl;
cout << stoll(str, 0, 10) << endl;
str = "1234567890.12345";
cout << fixed << setprecision(10) << stod(str) << endl;
str = "1234567890.123456789";
cout << fixed << setprecision(10) << stold(str) << endl;
cout << fixed << setprecision(0) << endl;
}
// 数学 常用函数
void math_func() {
int n = -3;
cout << abs(n) << endl; // 整数取绝对值
double f = -3.3;
cout << fabs(f) << endl; // 浮点数取绝对值
double f1 = 1.23;
cout << ceil(f1) << endl; // 向上取整
double f2 = 1.98;
cout << floor(f2) << endl; // 向下取整
double f3 = 1.45;
cout << round(f3) << endl; // 四舍五入
int n1 = 2, m1 = 4;
cout << pow(n1, m1) << endl; // 乘方
int n2 = 16, m2 = 2;
cout << pow(n2, 1.0 / m2) << endl; // 开方
cout << sqrt(n2) << endl; // 平方根
cout << cbrt(n2) << endl; // 立方根
int x1 = 10, y1 = 3;
cout << max(x1, y1) << endl; // 最大值 (泛型)
cout << min(x1, y1) << endl; // 最小值 (泛型)
div_t result = div(x1, y1); // 整数除法运算 (10 / 3)
cout << result.quot << endl; // 返回 商 (3)
cout << result.rem << endl; // 返回 余数 (1)
double f4 = 1.2345;
cout << fixed << setprecision(2) << f4 << endl; // 保留小数位数
}
// 字符 常用函数
void char_func() {
char c1, c2;
// 普通 输入输出
cin >> c1;
cout << c1 << endl;
// 函数 输入输出
c2 = getchar();
putchar(c2);
putchar('\n');
// 判断 c 是否是数字字符,返回 0 或 1 代表 false 或 true
cout << isdigit(c1) << endl;
// 判断 c 是否是一个字母,返回 0 或 1 代表 false 或 true
cout << isalpha(c2) << endl;
// 判断 c 是否是一个数字或字母,返回 0 或 1 代表 false 或 true
cout << isalnum(c2) << endl;
// 判断 c 是否是一个小写字母,返回 0 或 1 代表 false 或 true
cout << islower(c2) << endl;
// 判断 c 是否是一个大写字母,返回 0 或 1 代表 false 或 true
cout << isupper(c2) << endl;
// 如果 c 是一个大写字母,则返回其 小写字母 ASCII 码值
cout << char(tolower(c2)) << endl;
// 如果 c 是一个小写字母,则返回其 大写字母 ASCII 码值
cout << char(toupper(c2)) << endl;
}
// 字符数组 常用函数
// 参考资料:https://www.runoob.com/cprogramming/c-strings.html
// 参考资料:https://www.runoob.com/cprogramming/c-standard-library-string-h.html
void char_array_func() {
// 普通读取 (不包括 行末换行符)
char arr1[1000 + 1];
memset(arr1, 0, sizeof(arr1));
cin >> arr1;
cout << arr1 << endl;
// 读取 行末换行符 (ASCII 10)
int c = getchar();
cout << c << endl;
// 整行读取 (包括 行末换行符)
char arr2[1000 + 1];
memset(arr2, 0, sizeof(arr2));
cin.getline(arr2, sizeof(arr2));
cout << arr2 << endl;
// 连续读取
char arr3[1000 + 1];
memset(arr3, 0, sizeof(arr3));
int cnt = 0;
while (cin >> arr3) {
cout << arr3 << endl;
if (++cnt >= 3) {
break;
}
}
// 返回字符数组有效长度 (非空字符 '\0')
cout << strlen(arr2) << endl;
// 比较字符数组
cout << strcmp(arr1, arr3) << endl;
// 连接两个字符数组
strcat(arr1, arr3);
cout << arr1 << endl;
// 复制字符数组
strcpy(arr1, arr3);
cout << arr1 << endl;
strcpy(arr1, "aBcD");
cout << arr1 << endl;
// gets(), strupr() 和 strlwr() 在比赛中已不可用
/*
// 转换字符数组为大写
cout << strupr(arr1) << endl;
// 转换字符数组为小写
cout << strlwr(arr1) << endl;
*/
// 在参数 str 所指向的字符串中搜索第一次出现字符 c(一个无符号字符)的位置。
// strchr(str, c)
strcpy(arr1, "aBcDeF");
char c1 = 'e';
char * ptr1 = strchr(arr1, c1);
cout << ptr1 << endl;
// 在字符串 str1 中查找第一次出现字符串 str2(不包含空结束字符)的位置。
// strstr(str1, str2)
strcpy(arr2, "DeF");
char * ptr2 = strstr(arr1, arr2);
cout << ptr2 << endl;
// 分解字符串 str 为一组字符串,delim 为分隔符。
// strtok(str, delim)
strcpy(arr1, "abc,def,ghi");
strcpy(arr2, ",");
char * arrarr[100 + 1][1000 + 1];
memset(arrarr, 0, sizeof(arrarr));
char * ptr3 = strtok(arr1, arr2);
while (ptr3 != NULL) {
cout << ptr3 << endl;
ptr3 = strtok(NULL, arr2);
}
}
坚持!!!!
// 字符串类 常用函数
// 官方资料:https://zh.cppreference.com/w/cpp/string/basic_string
void string_func() {
string str1, str2, str3;
int pos, len; // 位置,长度
// 普通读取
cin >> str1;
cout << str1 << endl;
// 读取 行末换行符 (ASCII 10)
int c = getchar();
cout << c << endl;
// 整行读取
getline(cin, str2);
cout << str2 << endl;
// 连续读取
int cnt = 0;
while (cin >> str3) {
cout << str3 << endl;
if (++cnt >= 3) {
break;
}
}
// 字符数组 转换 字符串
char arr[100 + 1] = "abcXYZabc";
string str(arr);
cout << str << endl;
// 字符串 转换 字符数组
str = "abcdef";
strcpy(arr, str.c_str());
cout << arr << endl;
// 判断 字符串 是否为空
cout << str2.empty() << endl;
// 返回 字符串 有效长度 (非空字符 '\0')
cout << str2.size() << endl;
cout << str2.length() << endl;
cout << strlen(str2.c_str()) << endl;
// 比较 字符串
cout << (str1 == str3) << endl;
cout << str1.compare(str3) << endl;
// 连接 两个 字符串
cout << str1 + " " + str3 << endl;
str1.append(str3);
cout << str1 << endl;
// 复制 字符串
str1 = str3;
cout << str1 << endl;
// 插入 符串 insert
str1 = "abcdef";
str2 = "xyz";
pos = 3;
str1.insert(pos, str2);
cout << str1 << endl;
// 查找 字符串 find, rfind,
// find_first_of, find_first_not_of, find_last_of, find_last_not_of
str1 = "AAAxyzBBBxyzCCC";
str2 = "xyz";
pos = str1.find(str2); // 从左向右查找
cout << pos << endl;
pos = str1.rfind(str2); // 从右向左查找
cout << pos << endl;
str1 = "AAA";
str2 = "xyz";
if (str1.find(str2) == string::npos) {
cout << "Not Found" << endl;
}
// 替换 字符串 replace
str1 = "AAABBBCCC";
str2 = "xyz";
pos = 3;
len = 3;
cout << str1.replace(pos, len, str2) << endl;
// 截取 字符串 substr
str1 = "AAAxyzBBB";
pos = 3;
len = 3;
cout << str1.substr(pos, len) << endl;
// 删除 字符串 erase
str1 = "AAAxyzBBB";
pos = 3;
len = 3;
cout << str1.erase(pos, len) << endl;
// 清除 字符串 clear
str1 = "AAAxyzBBB";
str1.clear();
cout << str1 << endl;
// to_string 换整数或浮点值 为 字符串
long long n1 = 1.2e18;
cout << to_string(n1) << endl;
double f1 = 123.456789;
cout << to_string(f1) << endl;
// 字符串 转 整数 (int 范围 有效)
str1 = "1200";
cout << stoi(str1) << endl;
cout << stoi(str1) + stoi(str1) << endl;
// 字符串 转 浮点数 (float 范围 有效)
str1 = "123.45";
cout << stof(str1) << endl;
cout << stof(str1) + stof(str1) << endl;
}
背爽了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
```