c语言 数组中找最接近的数_牛客C语言基础题目过关4

这篇博客分享了使用C语言解决数组中找最接近的数、制作接近正方形的广告牌、凑钱问题、查找最小编号、统计超半数出现的数、字母频率统计、质数计算以及报数淘汰问题的思路和方法,涉及循环、条件判断、数组操作等基础知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c7403f19950518ceb65d5d1ad4847fff.png

题目1:箱子归位  其实就是求箱子坐标跟中心点坐标(2,2)(因为我把左上角当做 0,0)的横纵坐标差值的绝对值之和。比如(4,4)跟(2,2),得到的就是4。

我想怎么做:横纵坐标范围都是固定的。中心也是确定的。不确定的只有箱子所在的位置。我从第一行第一个开始判断对应的值是否为1(因为1代表箱子啊,我找到1我就知道箱子坐标了),这行没有就下一行,如此循环。找到了之后,因为要的是横纵差绝对值,所以我分成4种情况来计算了...我忘记C语言有没有取绝对值的函数了。最后得到结果输出,直接return 0;收工。

————————分割线————————

2c8577894d6a0ec05dee054a3f507a5e.png

题目2:换种说法就是,让你制作一个矩形的广告牌,其面积会输入给你(肯定不会给你一个质数代表面积)。你要做的就是制作一个该面积的,边长为整数的,尽可能接近正方形的矩形广告牌,也就是长跟宽的差距尽可能小。你要输出对应的宽跟长。

我想怎么做:我声明了x,y来表示宽和长。既然要接近正方形,我直接就对面积进行开方(要包含头文件math.h),得到的可能是小数为0的(若恰好是某数平方得到的呢?),也可能是带小数部分的,没关系,我们直接强制类型转换为int类型(其实强制转换符不加也行,它装到int的x里自然会截去小数部分),反正宽是往小了取,这波不会亏。我们拿面积以这个宽取余数,看看是不是能被整除,是的话就说明此时宽和长都是整数,而且我们是从开方后的值开始算的,长宽很接近。如果不能整除,那就把宽减小1,再判断,循环往复,直到 面积%宽==0  我们就结束循环(结束宽的自我减小)。然后我们就可以输出宽和长了。

————————分割线————————

3da423049f1fcc6d79b49956159f07ef.png

题目3:题目自定义两种钞票的面值a,b。问你能不能凑出c元来...能就输出Yes,不能就No。

我想怎么做:首先我注意到它给了abc的范围,但是没说c一定是最大的,只是它的取值范围比较大。所以当c为最小值的时候我直接输出No了,然后若c不是最大也不是最小的时候,我拿两个面值的钞票都凑了一遍(其实就是取余啦),如果都凑不出来,那就No了。为啥呢,因为我懒得找是谁比c大,谁比c小啊,反正只有一种比c小,而c又不是该值的倍数,那肯定凑不出来。剩下的就是c最大的情况了,直接枚举法,省脑子。

————————分割线————————

f17611160204de2c2b105cdd0538537e.png

题目4:它意思是这样的,每组有两行,它的组成如下:

N  数0 数2 ... 数N-1       (注意,数的编号是从0开始。总共N个数)

目标数

你要从N个数中找到出现目标数的最小编号是多少,没有就输出No

我想怎么做:题目已经说了数的数目不超过20个,我选择创建数组把它们装进去,再记下这个目标数,然后从数组的开头编号0开始往后面找,一旦找到我就输出这个编号,若是找遍了这N个数都没找到,就输出No。怎么判定它找没找到呢?有N个数,也就是说最大数组下标是N-1,我一旦找到我就break,停止循环,也就停止了k的自增(k自增,代表我要去对应的编号找数)。若是都没有,它就会自然而然地自增到N,然后自然而然地结束了循环(我代码里的循环条件是k

————————分割线————————

d5f5df265bfbff94614549f144a0e92a.png

题目5:题目给了N个数,我们要找出出场率超过50%的数

我想怎么做:我最开始是想直接记录这些数出现的次数,那我肯定要创建数组(初始化值为0),然后出现某个数就把对应下标的数组的值加1,可是看到题目的数据规模,我就知道这不太现实。因为最大的数可以达到1e9,要是要用数值当下标计数的方式,能不能创建这么大的数组且不提,我们到时候要遍历这个数组来寻找哪个才是最大值,想想就觉得费时费力。就没打算这样解。思考无果,去翻了翻讨论区,看到一句话,简直如醍醐灌顶。“既然出现的次数超过半数,那么顺序排列时,中间的那个数就是它”。所以我就先把所有的数储存到数组里,然后用笨方法(这种排序方式叫啥我不知道,我只知道这是最省脑子(笨)的排序方式)把它们按顺序排列,然后取出中间值。

————————分割线————————

dbcd81a5caf6823c3550a86b4b025377.png

题目6:就是说有一大串,带空格,还带换行的内容,当做一篇英语作文。我们要统计出现过的小写字母出现的次数,也就是说没出现过就不统计。

我想怎么做:看到这题的时候我是觉得我解不出来的,因为我不知道怎么判断这个文章结束了没有。那个以判断getchar()获取字符是否成功来当做停止输入的条件其实我觉得本来就是很奇怪的,我不理解为啥最后它能奏效,或者说它并没有奏效,但是因为某些情况,代码完成有惊无险地它的任务...后面的处理方式和就和上题先考虑到的处理方式一样了,扫描到字符,把它当做数组下标(字符跟数字是可以相互转换的),然后储存次数。最后遍历a到z的数组区间不为0就输出次数。

————————分割线————————

6e3cfc25b8d1b65343a207ada4fa0136.png

题目7:是不是感觉风格突变?这代码是我复制粘贴上去的...我自己做总是超时,也没个能正常处理的方法...我抄的这段代码,我感觉写的很好,是我想不出来的思路...

他的思路是:先创建个足够大的数组,初始化值为1,然后根据“两大于1的数相乘得到的肯定不是质数”这一原则,从2*2开始...到2*某个数,然后3*3...到3*某个数,反正就是把乘出来的数对应下标的数组的1改成0,表示它们不是质数。这里还有一个细节,就拿刚才的2和3来说,它们都是质数,所以拿来当做相乘的数,若是4这样的非质数的,它对应的倍数早就在2的时候就给PASS掉了,自然不需要再来一遍,所以在相乘之前先对这个数本身进行了质数判断(其实就是看其下标对应的数组值是不是1啦)。

处理好那些非质数之后,该用户十分清楚我们的最终目的:输出不超过某个数N的质数个数。所以,它从第二项开始遍历那个范围足够大的数组,若本身是质数,就把值更替成前一项的值+1,若不是质数,就和前一项一样,这样的效果其实就是,在这个数之前(包括这个数本身)出现的质数的个数储存到这个数对应的数组当中了。

到时候题目要输入哪个数,我们直接从数组里取出这个下标对应的数组值,就是不超过这个数的质数数目了。

这思路,我真想不出来。。。

————————分割线————————

6756efa3c0fc54d1028d4103f3102e7a.png

题目8:给你N个数分别从0到N-1的序号排列,然后从某个值K对应的编号开始报数,报数报到M的离场,剩下的接着从1开始报,人报完一遍就从编号0接上,当场上只剩下最后一个数的时候,输出它是哪个编号的数。

我想怎么做:数据规模还是可以接受的,我创建一个足够大的数组,初始化值为1(懒得用memset函数,直接用循环来初始化了),数组的下标就代表编号,数组所储存的值 1或0,代表有没有被淘汰(0代表被pass)。我用一个计数器赋值以M的值,然后去逛逛数组里的数据,若是这个数还有效,也就是没被pass,我就当做是有效报数,然后计数器-1,当它啥时候减到0,就把刚才那个数pass掉。然后接着往后报数...都报了一遍就从编号0开始接着判断有效报数...至于怎么做到循环遍历数组...我这么说吧...如果这个数组范围是从0到5,那我创建一个自增的数k,从0开始,每一次访问数组都增1,然后访问规则...比如数组名sum,那我访问规则就弄sum[(5+k)%5]  。看,这样的话随着k值的自增,那个下标的值就会是0 1 2 3 4 0 1 2 3 4...这样循环下去...就可以循环遍历数组了。就到这吧,后面的题目还不会写...溜了...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值