# C和CPP的练习仓库 **Repository Path**: mczs/practiceCCPP ## Basic Information - **Project Name**: C和CPP的练习仓库 - **Description**: 个人写的有意思的C和CPP小程序 - **Primary Language**: C++ - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-10-23 - **Last Updated**: 2024-12-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: C语言, Cpp ## README # C和CPP的练习仓库 **Powered by ZephyrBD** 写程序中遇到一些有意思的练习题,我会补充一下,然后提交到这个仓库 所以很杂,什么程序都有 ## 声明 本人写CPP程序的时候默认会写如下代码 ``` #include "bits/stdc++.h" //引用非标准C++库 using namespace std; using ll = long long; //用ll指代long long const int N = ;//定义一个常数用来确定数组 int main() { //用于C++中优化输入输出速度 //关闭C++标准库中的iostream(即cin、cout等) //和C标准库中的stdio(即scanf、printf等)之间的同步 ios::sync_with_stdio(0); //解除cin和cout之间的绑定 cin.tie(0),cout.tie(0); return 0; } ``` ## 有意思的小程序 1. 矩阵乘法计算器 2. Unix时间戳转换器(有BUG) 3. 随机取数并排列(输入一个数字表示要取多少个(1 <= x <= 100)) 4. 一维前缀和和Kadane算法(P1115 最大子段和) 5. XOGame(Based on Qt) 6. 初见结构体 ## Hydro训练 ### 1.前缀和与差分 1. prc30.[深进1.例1]求区间和 2. prc31. #P2004. 领地选择 3. prc32. #P3397. 地毯 4. prc33. #P8772. [蓝桥杯 2022 省 A] 求和 5. prc34. #P6625. [省选联考 2020 B 卷] 卡牌游戏 6. prc35. #P5638. 【CSGRound2】光骓者的荣耀 7. prc36. #P6568. [NOI Online #3 提高组] 水壶 8. prc37. #P3078. [USACO13MAR] Poker Hands S 9. prc38. #P1719. 最大加权矩形 10. prc39. #P9094. [PA2020] Mieszanie kolorów 11. prc40. #P1969. [NOIP2013 提高组] 积木大赛 12. prc41. #P2280. [HNOI2003] 激光炸弹 13. prc42. #P2367. 语文成绩 14. prc43. #P1672. [USACO05FEB] Feed Accounting S ### 2.二分与经典排序 15. prc44. #P2440. 木材加工 16. prc45. #P2678. [NOIP2015 提高组] 跳石头 17. prc46. #P1024. [NOIP2001 提高组] 一元三次方程求解 18. prc47. #P1918. 保龄球 19. prc48. #P2249. 【深基13.例1】查找 20. prc49. #P1923. 【深基9.例4】求第 k 小的数 21. prc50. #P1177. 【模板】排序 22. prc51. #P1104. 生日 23. prc52. #P1271. 【深基9.例1】选举学生会 24. prc53. #P1093. [NOIP2007 普及组] 奖学金 25. prc54. #P8647. [蓝桥杯 2017 省 AB] 分巧克力 ### 3.思维与贪心 26. prc58. #P1223. 排队接水 27. prc59. #P1090. [NOIP2004 提高组] 合并果子 28. prc60. #P8535. 「Wdoi-2」森罗结界 29. prc61. #P2676. [USACO07DEC] Bookshelf B 30. prc62. #P3742. umi的函数 31. prc63. #P2356. 弹珠游戏 32. prc64. #P1614. 爱与愁的心痛 33. prc65. #P7285. 「EZEC-5」修改数组 34. prc66. #P1803. 凌乱的yyy 线段覆盖 35. prc67. #P1208. [USACO1.3] 混合牛奶 Mixing Milk 36. prc68. #P1376. [USACO05MAR] Yogurt factory 机器工厂 37. prc69. #P4995. 跳跳! ### 4.数论入门 38. prc55. #P1029. [NOIP2001 普及组] 最大公约数和最小公倍数问题 39. prc56. #P1579. 哥德巴赫猜想(升级版) 40. prc57. #P1036. [NOIP2002 普及组] 选数 41. prc70. #P1888. 三角函数 41. prc71. #P3197. [HNOI2008] 越狱 ## PTA训练 **注意:函数题不包含main的部分** - 循环嵌套 1. 7-1 计算阶乘和 2. 7-3 输出整数各位数字 3. 7-5 1000以内所有各位数字之和为n的正整数 4. 7-4 水仙花数 5. 7-6 找完数 6. 7-7 求n以内最大的k个素数以及它们的和 7. 7-8 验证“哥德巴赫猜想” 8. 7-9 梅森数 9. 7-10 打印沙漏 - 普通变量做函数参数 10. (函数题)6-1 K以内满足条件的数和 11. (函数题)6-2 使用函数求特殊a串数列和 12. (函数题)6-3 统计各位数字之和是5的数 13. (函数题)6-4 统计某类完全平方数 14. (函数题)6-5 统计个位数字 15. (函数题)6-6 判断满足条件的三位数 16. (函数题)6-7 使用函数输出一个整数的逆序数 17. (函数题)6-8 使用函数求素数和 18. (函数题)6-9 使用函数输出水仙花数 19. (函数题)6-10 找出大于num的最小素数 - 一维数组 20. 7-1 将数组中的数逆序存放 21. 7-2 求最大值及其下标 22. 7-3 查找整数 23. 7-4 冒泡法排序 24. 7-5 交换最小值和最大值 25. 7-6 选择法排序 26. 7-7 数组元素循环右移问题 27. 7-8 求一批整数中出现最多的个位数字 28. 7-9 简化的插入排序 29. 7-10 组合数的和 - 二维数组和数组名作为函数参数 30. 6-1 在数组中查找指定元素 31. 6-3 使用函数的选择法排序 32. 6-2 数组循环右移 33. 6-4 求矩阵不靠边元素之和 34. 6-5 分类统计字符个数 35. 6-6 移动字母 36. 6-7 连接字符串 37. 7-1 求矩阵各行元素之和 38. 7-2 矩阵运算 39. 7-3 方阵循环右移 40. 7-4 判断上三角矩阵 41. 7-5 找鞍点 42. 7-6 字符转换 43. 7-7 统计大写辅音字母 44. 7-8 删除重复字符 45. 7-9 统计一行文本的单词个数 46. 7-10 最长最短单词 47. 7-6 字符串排序 ## 快速排序 ``` void quick_sort(ll num[],ll l,ll r) { /* 这是快速排序算法的递归终止条件。当子数组的左边界大于或等于右边界时, 说明子数组中最多只有一个元素,此时不需要进行排序,直接返回 */ if(l >= r) { return; } ll i = l - 1,j = r + 1,mid = num[(l + r) >> 1];// 选择基准元素 /* 关于mid:这种选择基准元素的方式是一种常见的优化, 可以在一定程度上避免最坏情况的发生。 */ while(i < j) { //从左向右找到第一个大于等于 x 的元素 do { i++; }while(num[i] < mid); //从右向左找到第一个小于等于 x 的元素 do { j--; }while(num[j] > mid); //交换元素 if(i < j) { swap(num[i],num[j]); } } /* 在双指针i和j移动并交换元素的过程中,j指针从右向左移动,寻找小于等于基 准值x的元素。当i < j的条件成立且完成一次交换后,j所指向的位置及其左边 的元素都满足小于等于基准值的条件。 */ quick_sort(num,l,j); quick_sort(num,j+1,r); } ``` ## 归并排序 ``` ll vote[N]; ll temp[N]; void merge(ll l,ll mid,ll r)//合并数组 { ll i = l,j = mid + 1,k = l; while(i<=mid&&j<=r) { if(vote[i] < vote[j]) temp[k++] = vote[i++]; else temp[k++] = vote[j++]; } while(i<=mid) temp[k++] = vote[i++]; while(j<=r) temp[k++] = vote[j++]; for(ll i=l;i<=r;i++) vote[i] = temp[i]; } void mergesort(ll l,ll r)//归并排序 { if(l>=r) return; ll mid = l + (r-l)/2; mergesort(l,mid); mergesort(mid+1,r); merge(l,mid,r); } ``` ## 线性筛(欧拉筛) ``` int isprime[N1]; int prime[n2]; void is_prime() { int cnt = 1; prime[0] = 2; for(int i=2;i<=n;i++) { if(!isprime[i]) prime[cnt++] = i; for(int j=0;prime[j]<=n/i;j++) { isprime[i*prime[j]] = 1; if(i%prime[j] == 0) break; } } } ``` ## 埃氏筛 ``` void is_prime(int n) { prime[0] = 2; for(int i=2;i<=n;i++) { if(isprime[i]==0) { prime[cnt++] = i; for(int j=i;j<=n;j+=i) { isprime[j] = 1; } } } } ``` ## 快速模(快速幂) ``` ll qmi(ll a,ll b,ll mod) { ll ans = 1; while(b) { if(b & 1) ans = ans * a % mod; // “&” 双目运算符 运算规则:当两个相应的二进制位都为 1 时,该位的结果为 1;否则为 0 a = a * a % mod; b >>= 1; } return ans; } ``` **注意:CPP的程序我编译的exe版本脱离IDE运行时遇到了** **“由于找不到libstdc++ 6.dll 无法继续执行代码”的报错** **所以这里不提供编译好的版本** ## 欢迎各位初学者来看看