Study Experience (暑假篇 1)

作为一个计算机专业的学生 偶然听到暑期留校的老师提及该应用可以记录自己的一些学习经历 于是我决定创建一个属于自己的计算机学习经历 这应该比手抄记录 或者单独记录在备忘录要方便灵活的多 这里竟然还可以插入代码 真是个不错的应用 而且用户很多 有很多高手 值得我去学习提升自己的水平

过完这个暑假我就已经大二了 在这一年里我也不知道我自己在干嘛 上了一堆没用的课 在课上刷了一堆没有用的视频 在专业上也没有学好 只考了40多分 要不是老师捞 把平时分拉满 我才及格 这一年 我玩也没玩到 女朋友也没找到 我从初次高考的300多分 到500多分 从初进学校的意气风发 至今沦落至此 我没有努力吗 似乎也不能这样说 也许是我的努力少了一个东西  是 坚持 天赋我不知道我有么有 但我知道我只有坚持着努力才会发掘出自己的天赋 有些话我无法一次性说完 说完了也没有意思 没有去尝试还是少说大话 所以在接下来的日子我会持续更新我的博客 也许无人问津 也许会有形形色色的人参观 不论你们说什么 我希望我都会坚持着走自己的道路 采纳一些好的建议 接纳所有的诋毁和辱骂

再去找回当初的自己

我现在只学了C语言所以最近几篇只会更新C语言的题目 将一些我认为对一些初学者有用 并且有兴趣了解的一些题目挂在这上面 如果代码或者思路不对的话 大佬们都可以在评论区或私信指导(也许没人看)废话不多说那就开始吧 我已经上了两天课了 信息量爆炸了 上题:

1.求超大数的阶乘 要使用数组去解决 卧槽 题目找不到了 那我也凭自己的记忆还原一下题目

题目:输入一个 n 求 从 1 到 n 的阶乘和 差不多就是求 1!+2!+3!.........+n! 的值

开始解题:

#include

#define MAX 10001
void mul(int a[],int n)
{
	int carry=0;
	
	for(int i=0;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
#include

#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

又花了很多时间 发明这个方法的比上面那个还要聪明 根本无法理解这方法的原理 去b站上看也只知道一个大概 有没有哪个大佬可以解释清楚啊

3.本来想着继续写下一道题的 结果突然想起一个听说更快的排序 快排吧 学了一下 ............学了30 40 分钟 差不多能看懂 还是太笨了 直接开始上代码吧 而且我还看到有几种方法的快排 现在只学会了 hoare 法 我还看到了挖坑法 一般使用快排都是 hoare 法 所以我把 4. 留给挖坑 先用 hoare 法写一个例子吧

#include
#include

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

差不多搞懂了 诶 真累 ........隔了一天 早上也写了一道要用快排的题 发现有点问题 在 while 内循环的两个 while 中 while(right>left&&a[right]>a[key]) right--; while(right>left&&a[left]

4.挖坑法快排(隔天补充):

#include
#include

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=key) right--;
		a[hole]=a[right];
		hole=right;
		while(left

隔天晚上写完这个感悟还是有一点的,这个挖坑法我认为更适合初学快排者 尤其是线下没有老师教的情况下 我看一个叫做花想云博主的图片教学 我认为这个从理解方面来说要比 hoare 好理解 但是我认为 hoare 比这个的思路要快捷一点 所以我以后应该都是用 hoare 来实现快排

5.素数筛法 平时算素数空间大直接gg 所以又得学那个埃氏筛素数法吧 

题目:求 1,2,⋯,N 中素数的个数

开始解题:

#include
#include
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 的 刚开始写这道题的时候觉得很容易 结果发现还是超空间了 这种变态竞赛题根本就不能用正常人的第一思维去解题 老天再赐予我一次天赋吧 哈哈哈哈哈哈 

Study Experience (暑假篇 1)_第1张图片

这就是题目了 有没有大佬可以给出更牛的解 我这道题参考了ai噢

解题代码:

#include
#include
#include

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 最大不也才 20 吗 


 这一期的C语言练习就结束了 过几天又会发 主要是明天早上就有个考试 看看这几天学到了啥吧 也欢迎大家在底下评论 谢谢

你可能感兴趣的:(算法,学习心得,日记)