今天星期三了前两天又颓废了效率有所降低可能真的是累了最近大脑摄入的知识太多了感觉根本消化不了所以会上上网课但还是刷了几道题的包括pta上的链表题今天感觉自己的脑力值也有所恢复看先前的题目也舒畅多了有种茅塞顿开的感觉我学C语言的知识就是这样学的时候感觉非常难但是学完了过一段时间写起题来就会比以前简单很多我现在的处境对于我来说也是比较迷茫的但我知道只有坚持才能带我走出困境。当身处困境时 就把心交给希望也许现在的我看不到未来的道路但只要有希望就可以尝试着坚持下去。现在的计划就是在八月一号之前把能刷的题刷完然后学习数据结构在此非常推荐b站上的一位教数据结构的博主叫逊哥讲的非常的好那时候就可以减少一点算法题的刷题数顺便看有没有时间去学 c 下学期一定要把绩点提上去不然真会影响我之后的安排。1.题目这题也废了很长时间去理解还是搞懂了一点把次方转转化理解为二进制然后一直拆分余一的和整除的分为两种。刚开始上了B站的课也不理解刚好去抖音上搜了一下发现一个更逆天的写法天助我也解题代码#includestdio.h #includestdlib.h typedef long long ll; ll quick_pow(ll a,ll b,ll p) { if(b1) return a; if(b1) return a*quick_pow(a,b-1,p)%p; else return quick_pow((a*a)%p,b1,p); } int main() { ll a,b,p; scanf(%lld %lld %lld,a,b,p); printf(%lld^%lld mod %lld%lld,a,b,p,quick_pow(a,b,p)); return 0; }这题没有释义了因为ai也比较傻想进一步了解可以在抖音搜快速幂博主CLQB的讲解视频。2.题目全是关于素数的已经写上瘾了思路一样用线性筛法就行了。解题代码#include stdio.h #include stdlib.h #include string.h // 判断字符串是否为回文 int is_huiwen(char *a) { int len strlen(a); int left 0, right len - 1; while (right left) { if (a[right] ! a[left]) { return 0; } right--; left; } return 1; } int main() { int a, b; scanf(%d %d, a, b); // 分配内存并初始化素数标记数组 char *is_prime (char *)malloc((b 1) * sizeof(char)); memset(is_prime, 1, b 1); // 初始化为1表示素数 is_prime[0] is_prime[1] 0; // 0和1不是素数 // 分配素数存储数组 int *prime (int *)malloc((b 1) * sizeof(int)); int count 0; // 素数计数器 // 线性筛生成素数表 for (int i 2; i b; i) { if (is_prime[i] 1) { prime[count] i; // 存储素数 } // 标记i与已知素数的乘积为合数 for (int j 0; j count i * prime[j] b; j) { is_prime[i * prime[j]] 0; if (i % prime[j] 0) break; // 关键优化确保线性时间复杂度 } } // 遍历区间[a,b]输出回文素数 for (int i a; i b; i) { if (is_prime[i] 1) { char buffer[20]; // 足够存储64位整数的字符串形式 sprintf(buffer, %d, i); if (is_huiwen(buffer)) { printf(%d\n, i); } } } // 释放内存 free(is_prime); free(prime); return 0; }3.题目这是蓝桥杯的题目我觉得非常有意思啊如果按我自己的思路去写那估计得n久后面搜了豆包感觉理解很多这就是取模的魅力吗我本来想分成很多个可能脑袋还是不够聪明啊。解题代码#include stdio.h #include stdlib.h int main() { long long n, s, e, d; scanf(%lld %lld %lld %lld, n, s, e, d); // 情况1不使用瞬移 long long no_tele (e - s n) % n; if (no_tele 0) no_tele n; // 处理环的边界情况 // 情况2向前瞬移d格 long long forward (s d) % n; if (forward 0) forward n; // 调整位置0为n long long forward_cost (e - forward n) % n; if (forward_cost 0) forward_cost n; // 情况3向后瞬移d格 long long backward (s - d n) % n; // 确保结果为正 if (backward 0) backward n; long long backward_cost (e - backward n) % n; if (backward_cost 0) backward_cost n; // 比较三种情况取最小值 long long min_cost no_tele; if (forward_cost min_cost) min_cost forward_cost; if (backward_cost min_cost) min_cost backward_cost; printf(%lld\n, min_cost); return 0; }有没有大佬可以解释一下原理我还是比较懵逼特别是刚看到这个代码。4.题目分享一下第一次写栈的题目非常简单单纯分享也没啥注释自己写的一发入魂了。解题代码#includestdio.h #includestring.h #includestdlib.h int main() { int top-1; int stack[20]; char str[255]; fgets(str,sizeof(str),stdin); str[strcspn(str,\n)]\0; int lenstrlen(str); for(int i0;ilen;i) { if(str[i]() { stack[top]1; } if(str[i])) { if(top-1) { printf(NO); return 0; } else { top--; } } } if(top-1) { printf(YES); } else printf(NO); }对自己的代码排版还是很开心的。5.题目原理很简单但如果还用数组法建立栈的话那这道题就会超时所以得转化为指针。解题代码#include stdio.h #include stdlib.h int main() { int q; scanf(%d, q); while (q--) { int n; scanf(%d, n); int* pushed (int*)malloc(n * sizeof(int)); int* popped (int*)malloc(n * sizeof(int)); // 读取入栈序列 for (int i 0; i n; i) { scanf(%d, pushed[i]); } // 读取出栈序列 for (int i 0; i n; i) { scanf(%d, popped[i]); } int* stack (int*)malloc(n * sizeof(int)); int top -1; // 栈顶指针-1表示空栈 int pop_idx 0; // 出栈序列当前匹配位置 // 模拟入栈和出栈过程 for (int i 0; i n; i) { stack[top] pushed[i]; // 入栈 // 栈顶与当前出栈元素匹配时持续弹出 while (top ! -1 stack[top] popped[pop_idx]) { top--; pop_idx; } } // 判断是否所有元素都匹配且栈为空 if (top -1 pop_idx n) { printf(Yes\n); } else { printf(No\n); } // 释放动态分配的内存 free(pushed); free(popped); free(stack); } return 0; }主要是也不知道题目给出的元素个数上限有多少个。6.题目这题有点意思需要用算法了我刚开始甚至没用栈直接用了数组提交后直接一片红但你要我第一次写我也写不出啊所以接下来登场的是中国全面性最高的ai豆包直接上代码顿悟了一手。#include stdio.h #include stdlib.h #define MAX_N 3000005 int main() { int n; scanf(%d, n); int a[MAX_N]; int stack[MAX_N]; // 存储下标 int top -1; // 栈顶指针 int result[MAX_N]; // 存储结果 // 读取数组 for (int i 0; i n; i) { scanf(%d, a[i]); result[i] 0; // 初始化为0表示无更大元素 } // 单调栈处理 for (int i 0; i n; i) { // 当前元素大于栈顶元素对应的a值时弹出栈顶并记录结果 while (top ! -1 a[stack[top]] a[i]) { result[stack[top]] i 1; // 题目要求下标从1开始 top--; } stack[top] i; // 当前元素下标入栈 } // 输出结果 for (int i 0; i n; i) { printf(%d , result[i]); } printf(\n); return 0; }明天又是星期天了这一周真是荒废啊学的比较少而且感觉自己真的有点力不从心内心的欲望又开始控制我的大脑不知道该说什么更新也隔了这么久哎。今天的话我感觉还是可以的还是要坚持也正所谓当身处困境时将心交给希望。这次也不想聊太多没有成绩不想长篇大论。接下来我要开始学习C我要快速进入下一个状态不能总是把自己的水平放在周边的同学中。更新也许也会变慢但只要有好的题目我就会分享有什么学习建议都可以评论哦。