作为一个计算机专业的学生 偶然听到暑期留校的老师提及该应用可以记录自己的一些学习经历 于是我决定创建一个属于自己的计算机学习经历 这应该比手抄记录 或者单独记录在备忘录要方便灵活的多 这里竟然还可以插入代码 真是个不错的应用 而且用户很多 有很多高手 值得我去学习提升自己的水平
过完这个暑假我就已经大二了 在这一年里我也不知道我自己在干嘛 上了一堆没用的课 在课上刷了一堆没有用的视频 在专业上也没有学好 只考了40多分 要不是老师捞 把平时分拉满 我才及格 这一年 我玩也没玩到 女朋友也没找到 我从初次高考的300多分 到500多分 从初进学校的意气风发 至今沦落至此 我没有努力吗 似乎也不能这样说 也许是我的努力少了一个东西 是 坚持 天赋我不知道我有么有 但我知道我只有坚持着努力才会发掘出自己的天赋 有些话我无法一次性说完 说完了也没有意思 没有去尝试还是少说大话 所以在接下来的日子我会持续更新我的博客 也许无人问津 也许会有形形色色的人参观 不论你们说什么 我希望我都会坚持着走自己的道路 采纳一些好的建议 接纳所有的诋毁和辱骂
再去找回当初的自己
我现在只学了C语言所以最近几篇只会更新C语言的题目 将一些我认为对一些初学者有用 并且有兴趣了解的一些题目挂在这上面 如果代码或者思路不对的话 大佬们都可以在评论区或私信指导(也许没人看)废话不多说那就开始吧 我已经上了两天课了 信息量爆炸了 上题:
1.求超大数的阶乘 要使用数组去解决 卧槽 题目找不到了 那我也凭自己的记忆还原一下题目
题目:输入一个 n 求 从 1 到 n 的阶乘和 差不多就是求 1!+2!+3!.........+n! 的值
开始解题:
#include<stdio.h> #define MAX 10001 void mul(int a[],int n) { int carry=0; for(int i=0;i<MAX;i++) { int temp=a[i]*n+carry; a[i]=temp%10; carry=temp/10; } } void add(int b[],int a[]) { int carry=0; for(int i=0;i<MAX;i++) { int temp=a[i]+b[i]+carry; b[i]=temp%10; carry=temp/10; } } void prin_b(int b[]) { int i=MAX-1; while(b[i]==0) i--; for(;i>=0;i--) { printf("%d",b[i]); } } int main() { int n; scanf("%d",&n); getchar(); int a[MAX]={0}; int b[MAX]={0}; a[0]=1; for(int i=1;i<=n;i++) { mul(a,i); add(b,a); } prin_b(b); return 0; }ok啊 也是费了九牛二虎之力完成 先前一直输出不了 我说哪里有问题 结果发现是add函数的 b[ ] 写成了 a[ ] 了 服了 又浪费了点时间 开始下一题吧 想出用这种方法的人也算是个天才吧
2.学了这么久 还在用冒泡去排序 自己还是太菜了 先前也学不懂 昨天学了一个qsort 非常不错
题目:将读入的 N 个数从小到大排序后输出
题目很简单 但是如果用冒泡会超时 没办法又要学新知识了
开始解题:
#include<stdio.h> #include<stdlib.h> #define MAX 1001 int compare(const void* a,const void* b) { return (*(int *)a-*(int *)b); } int main() { int n; scanf("%d",&n); int a[MAX]; for(int i=0;i<n;i++) { scanf("%d",&a[i]); } qsort(a,n,sizeof(int),compare); for(int i=0;i<n;i++) { printf("%d ",a[i]); } return 0; }又花了很多时间 发明这个方法的比上面那个还要聪明 根本无法理解这方法的原理 去b站上看也只知道一个大概 有没有哪个大佬可以解释清楚啊
3.本来想着继续写下一道题的 结果突然想起一个听说更快的排序 快排吧 学了一下 ............学了30 40 分钟 差不多能看懂 还是太笨了 直接开始上代码吧 而且我还看到有几种方法的快排 现在只学会了 hoare 法 我还看到了挖坑法 一般使用快排都是 hoare 法 所以我把 4. 留给挖坑 先用 hoare 法写一个例子吧
#include<stdio.h> #include<stdlib.h> void swap(int *q,int *p) { int temp=*q; *q=*p; *p=temp; } void quick_sort(int a[],int start,int end) { if(end<=start) return; int left=start; int right=end; int key=start; while(right>left) { while(right>left&&a[right]>=a[key]) right--; while(right>left&&a[left]<=a[key]) left++; swap(&a[left],&a[right]); } swap(&a[key],&a[left]); quick_sort(a,start,left-1); quick_sort(a,left+1,end); } int main() { int n; scanf("%d",&n); int a[1001]; for(int i=0;i<n;i++) { scanf("%d",&a[i]); } quick_sort(a,0,n-1); for(int i=0;i<n;i++) { printf("%d ",a[i]); } return 0; }差不多搞懂了 诶 真累 ........隔了一天 早上也写了一道要用快排的题 发现有点问题 在 while 内循环的两个 while 中 while(right>left&&a[right]>a[key]) right--; while(right>left&&a[left]<a[key]) left++; 应该把后面那个 a[left] a[right] 与 a[key]的关系补充一个等于号
4.挖坑法快排(隔天补充):
#include<stdio.h> #include<stdlib.h> void quicksort(int a[],int start,int end) { if(start>=end) return; int left=start,right=end; int key=a[left]; int hole=left; while(left<right) { while(left<right&&a[right]>=key) right--; a[hole]=a[right]; hole=right; while(left<right&&a[left]<=key) left++; a[hole]=a[left]; hole=left; } a[hole]=key; quicksort(a,hole+1,end); quicksort(a,start,hole-1); } int main() { int n; scanf("%d",&n); int a[1001]; for(int i=0;i<n;i++) { scanf("%d",&a[i]); } quicksort(a,0,n-1); for(int i=0;i<n;i++) { printf("%d ",a[i]); } return 0; }隔天晚上写完这个感悟还是有一点的,这个挖坑法我认为更适合初学快排者 尤其是线下没有老师教的情况下 我看一个叫做花想云博主的图片教学 我认为这个从理解方面来说要比 hoare 好理解 但是我认为 hoare 比这个的思路要快捷一点 所以我以后应该都是用 hoare 来实现快排
5.素数筛法 平时算素数空间大直接gg 所以又得学那个埃氏筛素数法吧
题目:求 1,2,⋯,N 中素数的个数
开始解题:
#include<stdio.h> #include<stdlib.h> int main() { int n; scanf("%d",&n); int *a=(int *)malloc(sizeof(int)*(n+1)); for(int i=0;i<=n;i++) { a[i]=1; } a[0]=a[1]=0; for(int i=2;i<=n;i++) { if(a[i]==1) { for(int j=i*i;j<=n;j+=i) { a[j]=0; } } } int sum=0; for(int i=0;i<=n;i++) { if(a[i]==1) sum++; } printf("%d",sum); free(a); return 0; }6.本来是没有 6 的 刚开始写这道题的时候觉得很容易 结果发现还是超空间了 这种变态竞赛题根本就不能用正常人的第一思维去解题 老天再赐予我一次天赋吧 哈哈哈哈哈哈
这就是题目了 有没有大佬可以给出更牛的解 我这道题参考了ai噢
解题代码:
#include<stdio.h> #include<stdlib.h> #include<string.h> int compare(const void *a,const void *b) { char ab[21],ba[21]; sprintf(ab,"%s%s",(char *)a,(char *)b); sprintf(ba,"%s%s",(char *)b,(char *)a); return strcmp(ba,ab); } int main() { int n; scanf("%d",&n); char a[20][10]; for(int i=0;i<n;i++) { scanf("%s",a[i]); } qsort(a,n,sizeof(a[0]),compare); if(a[0][0]=='0') printf("0"); else { for(int i=0;i<n;i++) { printf("%s",a[i]); } } return 0; }这解题思路使用快排排列字符串转化为数的解 我也差不多 只是用的冒泡就不行了 可是 n 最大不也才 20 吗
这一期的C语言练习就结束了 过几天又会发 主要是明天早上就有个考试 看看这几天学到了啥吧 也欢迎大家在底下评论 谢谢