一级
cmath库中的常用函数
round()函数:对浮点数进行四舍五入
函数原型:
double round(double x);
float round(float x);
long double round(long double x);
示例:
round(3.2) = 3
round(3.8) = 4
round(-3.2) = -3
round(-3.8) = -4
pow()函数:计算次幂
函数原型:
double pow(double base, double exponent);
float pow(float base, float exponent);
long double pow(long double base, long double exponent);
sqrt():计算平方根
函数原型:
double sqrt(double x);
float sqrt(float x);
long double sqrt(long double x);
abs():计算整数的绝对值
fabs():计算浮点数的绝对值
ceil():向上取整
函数原型:
double ceil(double x);
float ceil(float x);
long double ceil(long double x);
floor():向下取整
函数原型:
double floor(double x);
float floor(float x);
long double floor(long double x);
随机生成数 骗分
srand(time(0));
int x = rand();
srand()函数是cstdlib库中的函数,原型为:
void srand(unsigned int seed)
作用是设置随机数生成器的种子值(seed)
time()函数是ctime库中的函数,当传入参数为0或nullptr 时,它会返回当前的系统时间(以从 1970 年 1 月 1 日午夜开始经过的秒数来表示)
rand 函数是cstdlib库中的函数,其原型为 int rand();。该函数会根据之前通过 srand 函数设置的种子值,按照特定的算法生成一个范围在0到MAX 之间的伪随机整数。MAX是一个常量,它定义了rand函数所能返回的最大随机数,其值至少为32767。
可以利用rand()生成某个范围内的随机数
int random_num = a + rand() % (b - a + 1);
这行代码的作用是生成一个位于闭区间 [a, b] 内的随机整数
进制转换
k进制转十进制
int calc(char c){
if(c >= 'A'){ // 如果字符是字母(即大于 '9')
return 10 + c - 'A'; // 转换为对应的数字值(A=10,B=11,...)
}
return c - '0'; // 如果是数字字符,直接转换为对应的数字值
}
int change(int k, string s){
int ans = 0;
for(int i = 0; i < s.size(); i++){
ans = ans * k + calc(s[i]); // 基于进制 k 进行累加
}
return ans; // 返回转换后的十进制数
}
十进制转k进制
string change(int x, int k) {
string ans = ""; // 初始化空字符串,用于存储转换结果
while (x != 0) {
int t = x % k; // 计算 x 对 k 取余,得到当前位的值
// 如果余数小于等于9,直接将其转换为字符并追加到结果字符串
if (t <= 9) {
ans = ans + (char)('0' + t); // '0' + t 转为对应数字字符
} else {
// 如果余数大于9,表示需要用字母 A,B,C...表示(例如10为A,11为B等)
ans = ans + (char)('A' + t - 10); // 'A' + (t - 10) 转为对应字母字符
}
x /= k; // 更新 x,x 除以 k
}
// 将结果字符串反转并返回,返回的字符串为转换后的进制表示
reverse(ans.begin(), ans.end()); // reverse 是反转字符串的标准操作
return ans;
}
取模技巧
(a + b) % x == (a % x + b % x) % x
(a - b) % x == ((a - b) % x + x) % x 保证即使a-b是负数,取余的结果也是正数
如果要计算a % x ,且a是某个需要通过for循环来计算的可能爆long long 的数,则在计算a的过程中可以边计算边对x取余
组合数与排列数
组合数:
long long C(int a, int b)
{
long long res = 1;
for(int i = a, j = 1;j <= b;i--, j++)
{
res = res * i / j;
}
return res;
}
日期与时间模拟
格式化输入:
scanf("%04d-%02d-%02d %02d:%02d:%02d %d", &y, &M, &d, &h, &m, &s, &x);
模板:
int months[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 判断是否为闰年
int is_leap(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
// 获取指定年份和月份的天数
int get_days(int y, int m) {
if (m == 2) return 28 + is_leap(y);
return months[m];
}
// 获取指定年份的天数
int get(int y) {
return 365 + is_leap(y);
}