【C语言】初学C语言经典题目(范围广,内容多)

✨作者:@平凡的人1

✨专栏:《C语言从0到1》

✨推荐刷题网站👉:进入网站

✨送给各位的一句话:既要脚踏实地 又要仰望星空

✨说明:无论做什么事情,我们既要有高远的理想,也要有脚踏实地的精神态度

学习C语言的同时,我们也要去大量的刷题,提高自己的编程能力,如果你不太会做题,没有关系,不要害怕,越害怕只会越害怕。牛客网提供题解专区和讨论区会有大神提供题解思路,对新手玩家及其友好,有不清楚的语法,不理解的地方,我们可以先去看看别人的思路,别人的代码,然后自己进行实现,这也能提高我们的编程能力!让我们一起加油把 


目录

前言😄

scanf函数的使用🔥

判断素数🔥

闰年判断🔥

九九乘法表🔥

在一个有序数组中查找数字🔥

N阶乘的值🔥

计算1!+2!+......+n!🔥

两边向中间移动🔥

模拟登录操作🔥

猜数字🔥

关机程序🔥

模拟实现strlen()函数🔥

递归实现计算一个数的每位之和🔥

递归和非递归实现求第n个斐波那契数🔥

交换数字🔥

结束语😄


前言😄

大家好啊,今天带来的是关于学习C语言前期我们比较经典的一些题目,如果对你有帮助的话,记得点赞关注加收藏哦,希望我们能够一起成长与进步💝


下面,让我们开始今天的主题吧!👇

scanf函数的使用🔥

先别着急,一开始,我先来简单介绍一下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类型的范围,所以第一种的方法比较好,能够方法数字超出范围。


N阶乘的值🔥

解法一:非递归解法

直接for循环走起来,不过要注意到一点的就是,int ret不能初始化为0,那样都不用算了,0乘以任何数都是0.

解法二:递归解法

递归解法分为两种情况,一种是当n=1时,不用去算,1的阶乘就是1。当n大于1的时候,我们直接采用递归来解决。


计算1!+2!+......+n!🔥

另一种做法,比如问我们1!+2!+3++......+10!,直接让我们算到10的阶乘。

当然这是在不考虑时间复杂度的情况之下的,对于刚开始来讲,先不要考虑太多,如果对时间复杂度感兴趣的,也可以看看我之前写过的博客。


两边向中间移动🔥

开始之前,先来认识一下Sleep()函数,就是让程序睡眠,比如Sleep(1000)就是睡眠10000毫秒,既1秒

以及//清空屏幕 system("cls");

感兴趣的可以了解了解,当然,你也可以去找.exe文件玩一玩。


模拟登录操作🔥

实际上的登录操作是比较复杂的,这里只是觉得的模拟一下而已,放在这里,是为了告诉大家字符串的比较不能用,而是用strcmp。同时,注意到文件的引用。直接来看看我们的代码及其运行结果


猜数字🔥

猜数字,自然要涉及到了随机数的生成,这样用srand()函数及rand()函数配合使用,同时,怎么随机去生成一个数,同时每分每秒都在改变呢?自然是时间,这里引入了时间戳的概念:

打开网站搜索时间戳:

我们还要注意到随机数的范围,可以用%来限制数的大小范围

下面,我们来实现猜数字的代码:


关机程序🔥

关机程序在说分支循环中goto就已经说过了,这里再来看一遍我们的代码:

其实要点就在于关机命令shutdouw -s -t以及取消关机命令shutdouw -a


模拟实现strlen()函数🔥

这里只说两种方法,其他方法就不展开说明了

解法一:递归实现

解法二:非递归实现


递归实现计算一个数的每位之和🔥

如果是1位数的话,直接返回就OK了,两位以上,先去/10然后递归下去解决便可。

说到递归。这自然离不开典型的递归题目:斐波那契数列,所以,下面将要说的就是我们的斐波那契数列数列。⏬


递归和非递归实现求第n个斐波那契数🔥

先来看看斐波那契数列是什么

斐波那契数列(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从大到小输出嘛,交换封装成一个函数去调用就行了,来,我们看看运行结果是什么:

 结果并没有达到我们预期的效果,这是为什么呢?

  1. 当实参传递给形参的时候,形参是实参的一份临时拷贝
  2. 对形参的修改不会影响实参

 这就是为什么没有交换的原因,我们怎么去改呢?用指针来解决即可

 

 好啦,问题解决

结束语😄

时间过得真快,又到了该说再见的时候了,到这里,这篇博客也到达了尾声,如果对你有帮助的话,那就支持一下吧​​ ​​ ​🌹同时如果想要刷题的话,记得进入网站

  • 51
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 29
    评论
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平凡的人1

佬的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值