✨作者:@平凡的人1
✨专栏:《C语言从0到1》
✨送给各位的一句话:既要脚踏实地 又要仰望星空
✨说明:无论做什么事情,我们既要有高远的理想,也要有脚踏实地的精神态度
目录
前言
scanf函数的使用
判断素数
闰年判断
九九乘法表
在一个有序数组中查找数字
N阶乘的值
计算1!+2!+......+n!
两边向中间移动
模拟登录操作
猜数字
关机程序
模拟实现strlen()函数
递归实现计算一个数的每位之和
递归和非递归实现求第n个斐波那契数
交换数字
结束语
大家好啊,今天带来的是关于学习C语言前期我们比较经典的一些题目,如果对你有帮助的话,记得点赞关注加收藏哦,希望我们能够一起成长与进步
下面,让我们开始今天的主题吧!
先别着急,一开始,我先来简单介绍一下scanf函数,我们都知道scanf函数是用来输入的,比如想输入一个字符,一个数字,一串字符,一串数字等等这些。 但是,我在这里并不是想说scanf怎么去使用,使用的话我们每一个都是会的。之所以放在这里讲的原因是因为在不同编译环境下,scanf可能会出现错误!什么错误呢?来看看简单的代码:
这段代码很简单把,但是在VS2019的编译环境下,我们按CTRL+F5运行一下,看看结果是什么?
直接报错了,错误的原因是什么?
这里说scanf是不安全的,建议考虑使用scanf_s替代。所以这是第一种解决方法。不过不太推荐使用这种方法,scanf_s函数是vs编译器自己提供的函数,非标准C提供的函数,也就是说只有Vs编译器认识
第二种解决方法:在源文件第一行添加:#define _CRT_SECURE_NO_WARNINGS
要想每次都不用手动在第一行添加的话,我们可以在VS安装路径下找到newc++file.cpp文件,忘记路径也没关系,直接搜素胡newc++file.cpp文件。
把上面的那句代码写在里面并保存即可,这样子就不用我们每次都手动自己去添加了!
好了,关于scanf函数的一些问题就在这里说清楚了!正式开始我们的主题把!
这是最开始就很容易频繁接触到的问题,这道题的核心在于素数是怎么判断的(只能被常数1或自己整除,不能被其他整数整除的正整数),以及一些相关的优化,提高效率。整体而言,这道题并不算难一起来看看我们的代码吧
这里把判断过程封装成一个函数,便于调用,以100-200之间的数字为例子。来看看我们的运行结果吧
好啦,看看我们的下一个题目吧✈️
什么是闰年,根据闰年的定义,我们有两种判断方法:
①非世纪年能被4整除,且不能被100整除的是闰年。(如2004年是闰年,1901年不是闰年)
②世纪年能被400整除的是闰年。(如2000年少闰年,1900年不是闰年)
这里运行只是简单测试一下,不要太过于较真哦
是谁的DNA动了,哈哈。99乘法表这大小从小学就开始接触到了,现在让我们来用代码实现一下吧
给定一个有序数组,让我们在数组中找到某个数字,并且返回下标。对于这这种题,我们可以用二分查找。本题比较基础,是基于有序的数组之上的,我们可以很好利用这一点。当然,遇到不是有序的数组,我们也有对应的方法去解决的,比如先排序,qsort快排,这里并不展开讨论。下面直接敲打代码⏯
上面有一个小细节,不知道大家注意到了没有,那就int mid = left +(right-left)/2.按理来说,我们可以直接让int mid = (left + right)/2的,但是为什么不这样写呢?想过没有,当left和right都很大的时候,两个很大的数相加起来可能就超出了int类型的范围,所以第一种的方法比较好,能够方法数字超出范围。
解法一:非递归解法
直接for循环走起来,不过要注意到一点的就是,int ret不能初始化为0,那样都不用算了,0乘以任何数都是0.
解法二:递归解法
递归解法分为两种情况,一种是当n=1时,不用去算,1的阶乘就是1。当n大于1的时候,我们直接采用递归来解决。
另一种做法,比如问我们1!+2!+3++......+10!,直接让我们算到10的阶乘。
当然这是在不考虑时间复杂度的情况之下的,对于刚开始来讲,先不要考虑太多,如果对时间复杂度感兴趣的,也可以看看我之前写过的博客。
开始之前,先来认识一下Sleep()函数,就是让程序睡眠,比如Sleep(1000)就是睡眠10000毫秒,既1秒
以及//清空屏幕 system("cls");
感兴趣的可以了解了解,当然,你也可以去找.exe文件玩一玩。
实际上的登录操作是比较复杂的,这里只是觉得的模拟一下而已,放在这里,是为了告诉大家字符串的比较不能用,而是用strcmp。同时,注意到文件的引用。直接来看看我们的代码及其运行结果
猜数字,自然要涉及到了随机数的生成,这样用srand()函数及rand()函数配合使用,同时,怎么随机去生成一个数,同时每分每秒都在改变呢?自然是时间,这里引入了时间戳的概念:
打开网站搜索时间戳:
我们还要注意到随机数的范围,可以用%来限制数的大小范围
下面,我们来实现猜数字的代码:
关机程序在说分支循环中goto就已经说过了,这里再来看一遍我们的代码:
其实要点就在于关机命令shutdouw -s -t以及取消关机命令shutdouw -a
这里只说两种方法,其他方法就不展开说明了
解法一:递归实现
解法二:非递归实现
如果是1位数的话,直接返回就OK了,两位以上,先去/10然后递归下去解决便可。
说到递归。这自然离不开典型的递归题目:斐波那契数列,所以,下面将要说的就是我们的斐波那契数列数列。⏬
先来看看斐波那契数列是什么
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
好啦。接下去就是代码实现,直接进入我们的代码,考虑到实际情况,采用非递归有时候可能时间效率太低,根本就算不出答案,所以这里会给出两种做法,分布是递归和非递归做法
解法一:非递归
解法二:递归
交换数字并不难,创建一个临时变量嘛,让两个数字交换就行了,这里提出来,是给大家指出一个容易出错的地方,话不多说,我们先来看一个例子。
这段代码的逻辑很清晰,就是想让a、b、c从大到小输出嘛,交换封装成一个函数去调用就行了,来,我们看看运行结果是什么:
结果并没有达到我们预期的效果,这是为什么呢?
- 当实参传递给形参的时候,形参是实参的一份临时拷贝
- 对形参的修改不会影响实参
这就是为什么没有交换的原因,我们怎么去改呢?用指针来解决即可
好啦,问题解决
时间过得真快,又到了该说再见的时候了,到这里,这篇博客也到达了尾声,如果对你有帮助的话,那就支持一下吧