#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <limits.h>
#define EPS 1e-9
#define MOD 100000000
#define in int
#define ll long long
#define fl float
#define db double
#define ch char
#define vd void
#define pr printf
#define sc scanf
//库函数解析
vd* memchr_exp(const vd* str, in c, size_t n)
{
//在参数str所指向的字符串的前n个字节中
//检索第一次出现字符c(+无符号)的位置
const unsigned ch* ptr = (const unsigned ch*)str;
//将vd*指针转换为const unsigned ch*指针
unsigned ch uc = (unsigned ch)c;
//将传入的in c显式转换为unsigned ch
for (size_t i = 0; i < n; i++)
//i是当前偏移量(索引)
{
if (ptr[i] == uc)
//指针ptr等价于数组ptr
//判断当前位置的字节是否等于目标字节uc
{
return (vd*)(ptr + i);
//找到则返回偏移后地址
//匹配标准memchr的vd
}
}
return NULL;
//未找到则返回空指针
}
in main()
{
ch str[] = "Hello, world!";
//定义字符数组并进行初始化
ch* result = (ch*)memchr_exp(str, 'w', sizeof(str));
//调用函数,以数组大小14为检索范围(包括任意位置的\0)
//返回值强行转换为ch*以进行后续处理,*实现地址的传递
if (result != NULL)
//若函数返回的不是空指针NULL
{
pr("字符'w'首次出现在索引:%d\n", result - str);
//进行地址运算,result整型形式表示地址,str表首地址
//result经过函数操作后被赋值为'w'所在的地址
//地址差运算值即对于数组str的下标值
pr("子字符串:%s\n", result);
//此时字符串形式的result相当于一个字符集
//result在指针整型的地址值做字符集首地址
//以此输出首地址后的含被检索到的'w'的字符串
}
else
{
pr("未找到字符'w'\n");
}
result = (ch*)memchr_exp(str, 'x', sizeof(str));
if (result == NULL)
{
pr("字符'x'未找到\n");
}
return 0;
}
//自定义函数
ll factorial1 (in n);
ll factorial2 (in n);
ll fibonacci1 (in n);
ll fibonacci2 (in n);
ll fibonacci2_memo (in n);
ll permute (in n, in k);
ll combine (in n, in k);
ll pow_mod (ll base, ll exp);
in digit_change (in n, in digit2);
in bin_to_dec (in bin);
in gcd (in a, in b);
in lcm (in a, in b);
in is_prime (in n);
in is_palindrome (const ch* s);
in contains_digit1 (in n, in p);
in contains_digit2 (const ch* num_str, in p);
in is_leap (in year);
in get_days_of_month(in year, in month);
in get_week_day (in year, in month, in day);
in turn_digits (in n);
vd extract_digits (in num, in digits[]);
vd string_frequency (const ch* str);
vd swap (in* a, in* b);
vd bubble_sort (in* arr, size_t n);
vd quick_sort (in arr[], in l, in r);
vd permute (in arr[], in start, in end);
vd reverse_arr (in arr[], in n);
vd scan_arr (in arr[], in n);
vd print_arr (in arr[], in n);
in sum_arr (in arr[], in n);
in max_index (in arr[], in n);
in binary_search (in arr[], in n, in x);
db distance_2d (db x1, db y1, db x2, db y2);
ll triange_area_2 (ll x1, ll y1, ll x2, ll y2, ll x3, ll y3);
ll n_triangle_area_2(in n, ll x[], ll y[]);
//求某个数的阶乘(非递归)
ll factorial1(in n)
{
if (n < 0)
return -1;
if (n > 20)
return -1;
ll result = 1;
for (in i = 2; i <= n; i++)
{
result *= i;
}
return result;
}
//求某个数的阶乘(递归)
ll factorial2(in n)
{
if (n <= 1)
{
return 1;
}
return n * factorial2(n - 1);
}
//求斐波那契数列第某个数(非递归)
ll fibonacci1(in n)
{
if (n == 0) return 0;
if (n == 1) return 1;
ll prev = 0;
ll curr = 1;
ll next;
for (in i = 2; i <= n; i++) {
next = prev + curr;
prev = curr;
curr = next;
}
return curr;
}
//求斐波那契数列第某个数(递归)
ll fibonacci2(in n)
{
if (n == 1 || n == 2)
{
return 1;
}
return fibonacci2(n - 1) + fibonacci2(n - 2);
}
//求斐波那契数列第某个数(递归+优化)
ll memo[1000] = { 0 };
ll fibonacci2_memo(in n)
{
if (n == 1 || n == 2)
{
return 1;
}
if (memo[n] != 0)
{
return memo[n];
}
memo[n] = fibonacci2_memo(n - 1) + fibonacci2_memo(n - 2);
return memo[n];
}
//求排列数P(n数,排k)
ll permute(in n, in k)
{
if (k < 0 || n < 0 || k > n)
{
return -1;
}
ll result = 1;
for (in i = n - k + 1; i <= n; i++)
{
result *= i;
}
return result;
}
//求组合数C(n数,组k)
ll combine(in n, in k)
{
if (k < 0 || n < 0 || k > n)
{
return -1;
}
if (k > n - k)
{
k = n - k;
}
ll result = 1;
for (in i = 0; i < k; i++)
{
result = result * (n - i) / (i + 1);
}
return result;
}
//求快速幂(模幂运算)
ll pow_mod(ll base, ll exp)
{
ll result = 1;
while (exp > 0)
{
if (exp & 1)
{
result = (result * base) % MOD;
}
base = (base * base) % MOD;
exp >>= 1;
}
return result;
}
//求10进制转<10进制(待拓展)
in digit_change(in n, in digit2)
{
in rem = n;
in mod[100];
in i = 0;
while (rem > 0)
{
mod[i] = rem % digit2;
rem = rem / digit2;
i++;
}
in result = 0;
in ten = 1;
for (in j = 0; j < i; j++)
{
result += mod[j] * ten;
ten = 10 * ten;
}
return result;
}
//求2进制数转10进制数
in bin_to_dec(in bin) {
if (bin == 0)
{
return 0;
}
if (bin < 0)
{
return -1;
}
in decimal = 0;
in base = 1;
while (bin > 0)
{
in digit = bin % 10;
if (digit != 0 && digit != 1)
{
return -1;
}
decimal += digit * base;
base *= 2;
bin /= 10;
}
return decimal;
}
//求两个数的最大公因数
in gcd(in a, in b)
{
if (a < 0)
a = -a;
if (b < 0)
b = -b;
while (b != 0)
{
in temp = b;
b = a % b;
a = temp;
}
return a;
}
//求两个数的最小公倍数
in lcm(in a, in b)
{
return a / gcd(a, b) * b;
}
//求某个数是否为素数
in is_prime(in n)
{
if (n <= 1)
{
return 0;
}
else if (n <= 3)
{
return 1;
}
else if (n % 2 == 0 || n % 3 == 0)
{
return 0;
}
for (in i = 5; i * i <= n; i += 6)
{
if (n % i == 0 || n % (i + 2) == 0)
{
return 0;
}
}
return 1;
}
//求某个数(字符串形式)是否为回文
in is_palindrome(const ch* s)
{
if (s == NULL)
{
return 0;
}
in left = 0;
in right = strlen(s) - 1;
while (left < right)
{
if (tolower(s[left]) != tolower(s[right]))
{
return 0;
}
left++;
right--;
}
return 1;
}
//求某数是否含某数字(一般数)
in contains_digit1(in n, in p)
{
ch str[50];
ch target = '0' + p;
sprintf(str, "%d", n);
for (in i = 0; str[i] != '\0'; i++)
{
if (str[i] == target)
{
return 1;
}
}
return 0;
}
//求某数是否含某数字(超大数,%s输入num_str)
in contains_digit2(const ch* num_str, in p)
{
ch target = '0' + p;
for (in i = 0; num_str[i] != '\0'; i++)
{
if (num_str[i] < '0' || num_str[i] > '9')
{
continue;
}
if (num_str[i] == target)
{
return 1;
}
}
return 0;
}
//求某年某月的天数
in is_leap(in year)
{
return (year % 4 == 0) && (year % 100 != 0) || (year % 400 == 0);
}
in get_days_of_month(in year, in month)
{
in days = 0;
switch (month)
{
case 1: case 3: case 5: case 7: case 8: case 10: case 12:
days = 31;
break;
case 4: case 6: case 9: case 11:
days = 30;
break;
case 2:
days = is_leap(year) ? 29 : 28;
break;
}
return days;
}
//求某年某月某日为星期几
in get_week_day(in year, in month, in day)
{
in century, weekday;
if (month < 3)
{
year--;
month += 12;
}
century = year / 100;
year %= 100;
weekday = (year + year / 4 + century / 4 - 2 * century + (26 * (month + 1)) / 10 + day - 1) % 7;
if (weekday < 0)
{
weekday += 7;
}
return weekday;
}
//求某个数字的反向输出
in turn_digits(in n)
{
in digits[10] = { 0 };
in i = 0;
in num = n;
while (num > 0)
{
digits[i++] = num % 10;
num /= 10;
}
in ans = 0;
for (in j = 0; j < i; j++)
{
ans = ans * 10 + digits[j];
}
return ans;
}
//求某十进制数的各位数
vd extract_digits(in num, in digits[])
{
if (num == 0)
{
digits[0] = 0;
digits[1] = -1;
return;
}
in i = 0;
while (num > 0)
{
digits[i++] = num % 10;
num /= 10;
}
}
//求给定字符串出现频次
vd string_frequency(const ch* str)
{
in freq[128] = { 0 };
for (in i = 0; str[i] != '\0'; i++)
{
unsigned ch c = str[i];
if (c == ' ' || isprint(c))
{
freq[c]++;
}
}
int count = 0;
for (in i = 0; i < 128; i++)
{
if (freq[i] > 0)
{
count++;
if (i == ' ')
{
pr("blank: %d\n", freq[i]);
}
else
{
pr("'%c': %d\n", i, freq[i]);
}
}
}
}
//要求两个整数交换
vd swap(in* a, in* b)
{
in temp = *a;
*a = *b;
*b = temp;
}
//要求升序排列(冒泡排序)
vd bubble_sort(in* arr, size_t n)
{
if (arr == NULL || n < 2)
{
return;
}
for (size_t i = 0; i < n - 1; i++)
{
in swapped = 0;
for (size_t j = 0; j < n - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
in temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = 1;
}
}
if (!swapped)
{
break;
}
}
}
//要求升序排列(快速排序1到r)
vd quick_sort(in arr[], in l, in r)
{
if (l >= r)
{
return;
}
in i = l, j = r;
in pivot = arr[(l + r) / 2];
while (i <= j)
{
while (arr[i] < pivot) i++;
while (arr[j] > pivot) j--;
if (i <= j)
{
swap(&arr[i], &arr[j]);
i++;
j--;
}
}
quick_sort(arr, l, j);
quick_sort(arr, i, r);
}
//要求全排数组(start到end)
vd permute(in arr[], in start, in end)
{
if (start == end)
{
for (in i = 0; i <= end; i++)
{
pr("%d ", arr[i]);
}
pr("\n");
}
else
{
for (in i = start; i <= end; i++)
{
swap(&arr[start], &arr[i]);
permute(arr, start + 1, end);
swap(&arr[start], &arr[i]);
}
}
}
//要求翻转数组
vd reverse_arr(in arr[], in n)
{
for (in i = 0; i < n / 2; i++)
{
in t = arr[i];
arr[i] = arr[n - 1 - i];
arr[n - 1 - i] = t;
}
}
//要求数组输入
vd scan_arr(in arr[], in n)
{
for (in i = 0; i < n; i++)
{
sc("%d", &arr[i]);
}
}
//要求数组输出
vd print_arr(in arr[], in n)
{
for (in i = 0; i < n; i++)
{
pr("%d ", arr[i], " \n"[i == n - 1]);
}
}
//求数组各元素的和
in sum_arr(in arr[], in n)
{
in s = 0;
for (in i = 0; i < n; i++)
{
s += arr[i];
}
return s;
}
//求数组最大元素下标
in max_index(in arr[], in n)
{
in idx = 0;
for (in i = 1; i < n; i++)
{
if (arr[i] > arr[idx])
{
idx = i;
}
}
return idx;
}
//求数组某元素的位置(升序,n元,二分找x)
in binary_search(in arr[], in n, in x)
{
in left = 0, right = n - 1;
while (left <= right)
{
in mid = (left + right) / 2;
if (arr[mid] == x)
{
return mid;
}
else if (arr[mid] < x)
{
left = mid + 1;
}
else right = mid - 1;
}
return -1;
}
//求平面上两点的距离
db distance_2d(db x1, db y1, db x2, db y2)
{
db dx = x2 - x1;
db dy = y2 - y1;
return sqrt(dx * dx + dy * dy);
}
//求三角形的面积(2倍)
ll triange_area_2(ll x1, ll y1, ll x2, ll y2, ll x3, ll y3)
{
ll area_2 = (x2 - x1) * (y3 - y1) - (x3 - x1) * (y2 - y1);
return area_2 < 0 ? -area_2 : area_2;
}
//求凸多边形面积(2倍)
ll n_triangle_area_2(in n, ll x[], ll y[])
{
ll area_2 = 0;
for (in i = 0; i < n; i++)
{
in j = (i + 1) % n;
area_2+= x[i] * y[j] - x[j] * y[i];
}
return area_2 > 0 ? area_2 : -area_2;
}帮我补充些考试时实用的