上一篇中,我们学会了用wireshark和tcpdump来分析TCP的“三次握手,四次挥手”,非常好用。这哥俩就是传说中的锤子
,拿着锤子
,看什么都像钉子
!在这篇文章中,我对准了HTTP
这颗钉子砸下去,咳咳。
为了对网络数据包的“流转”有更加深刻的理解,我在docker(远程)上部署一个服务,支持http方式调用。从客户端(本地)用http方式请求其中的一个接口,并得到响应数据。同时本地通过wireshark抓包,远程用tcpdump抓包,然后分析过程中的所有通信细节。悲剧是把美好的东西撕碎给人看,而我则是把复杂的东西撕碎了给人看。
文章稍长,请在看本文时保持耐心。我先通过工具获取HTTP通信的数据包,再来抽丝剥茧,深入二进制的天地里,解密HTTP所有的通信细节。分析过程中,由点到面,将相关知识串接起来。保证全篇读完之后,你对HTTP的理解会上升一个台阶!
我手头现在有一个地理几何相关的服务,它提供一组接口对外使用。其中有一个接口是Fence2Area
. 使用方传入一个围栏(由点的列表组成,点由<经度,纬度>表示)、点的坐标系类型(谷歌地图用的是wgs84, 国内腾讯、高德用的是soso, 而百度用的是另一套自己的坐标系),接口输出的则是围栏的面积。
一次正常的请求示例url, 这个大家都不陌生(我用docker_ip代替真实的ip):
Web内容通常分散地分布在很多地方,这可以防止“单点故障”,万一某个地方发生地震了,机房被毁了,那还有其他地方的机房可以提供服务。一般都会有所谓的“双活”,“多活”,所谓狡兔三窟
嘛。
这样,用户的请求会根据负载均衡
的原则,被重定向
到它应该去的地方。
服务器收到客户端请求后,向客户端返回一条带有状态码302
重定向的报文,告诉他们应该去其他的地方试试。web站点将重定向看成一种简单的负载均衡策略来使用,重定向
服务器找到可用的负载最小的机器,由于服务器知道客户端的地址,理论上来说,可以做到最优的重定向选择。
当然,缺点也是显而易见的,由于客户端要发送两次请求,因此会增加耗时。
DNS将几个IP地址关联到一个域上,采用算法决定返回的IP地址。可以是简单的轮转
;也可以是更高级的算法,如返回负载最轻的服务器的IP地址,称为负载均衡算法
;如果考虑地理位置,返回给客户端最近位置的地址,称为邻接路由算法
;还有一种是绕过出现故障的地址,称为故障屏蔽算法
。
DNS服务器总是会返回所有的IP地址,但是DNS客户端一般只会使用第一个IP地址,而且会缓存下来,之后会一直用这个地址。所以,DNS轮转通常不会平衡单个客户端的负载。但是,由于DNS服务器对于不同的请求,总是会返回轮转后的IP地址列表,因此,会把负载分散到多个客户端。
HTTP连接是HTTP报文传输的关键通道。
对于一个页面上同时出现多个对象的时候,如果浏览器并行地打开多个连接,同时去获取这些对象,多个连接的TCP握手时延可以进行重叠,速度会快起来。
如一个包含3张图片的页面,浏览器要发送4次HTTP请求来获取页面。1个用于顶层的HTML页面,3个用于图片。如果采用串行方式,那么连接时延会进行叠加。
但是并行连接也不绝对提升速度,如果一个页面有数百个内嵌对象,那要启动数百个连接,对服务器的性能也是非常大的挑战。所以,通常浏览器会限制并行连接的总数据在一个较小的值,通常是4个,而且服务端可以随意关闭客户端超量的连接。
另一方面,如果客户端网络带宽较小,每个连接都会去争抢有限的带宽,每个连接都会获取较小的速度,即每个对象都会以较小的速度去加载。这样,并行连接带来的速度提升就会比较小,甚至没有提升。
我们知道HTTP请求是“请求-应答”模式,每次请求-应答都要新建一个连接,完成之后要断开连接。HTTP是无状态的,连接之间没有任何关系。
HTTP是应用层协议,TCP是传输层协议。HTTP底层仍然采用TCP进行传输数据。TCP为HTTP提供了一层可靠的比特传输通道。HTTP一般交换的数据都不大,而每次连接都要进行TCP三次握手,很大一部分时间都消耗在这上面,有时候甚至能达到50%。如果能复用连接,就可以减少由于TCP三次握手所带来的时延。
HTTP 1.1默认开启keep-alive机制,从上面抓到的包也可以看到。这样,数据传输完成之后保持TCP连接不断开,之后同域名下复用连接,继续用这个通道传输数据。服务器在响应一个请求后,可以保持这个连接keep-alive timeout的时间,在这个时间内没有请求,则关闭此连接;否则,重新开始倒计时keep-alive timeout时间。
连接上传输多个HTTP事务,以此提高通信效率。底层的TCP其实也有keep-alive机制,它是为了探测TCP连接的活跃性。TCP层的keepalive可以在任何一方设置,可以是一端设置、两端同时设置或者两端都没有设置。新建socket的时候需要设置,从而使得协议栈调用相关函数tcp_set_keepalive,来激活连接的keep-alive属性。
当网络两端建立了TCP连接之后,闲置(双方没有任何数据流发送往来)时间超过tcp_keepalive_time
后,服务器内核就会尝试向客户端发送侦测包,来判断TCP连接状况(有可能客户端崩溃、强制关闭了应用、主机不可达等等)。如果没有收到对方的回答(ack包),则会在
75s。如果尝试tcp_keepalive_probes
次后,依然没有收到对方的ack包,则会丢弃该TCP连接。TCP连接默认闲置时间是2小时,一般设置为30分钟足够了。
在keep-alive的基础上,我们可以做地更进一步,在响应到达之前,我们将多条请求按序放入请求队列,服务端在收到请求后,必须按照顺序对应请求的响应。但由于网络环境非常复杂,因此即使请求是按顺序发送的,也不一定是按顺序到达服务端的。而且就算是服务端按序处理的,也不一定是按序返回给客户端,所以最好是在响应中附带一些可以标识请求的参数。
为了安全起见,管道化的连接只适合“幂等”的请求,一般我们认为:GET/HEAD/PUT/DELETE/TRACE/OPTIONS等方法都是幂等的。
以上,就是所有HTTP的通信细节了,足够在日常开发 作中使用了。更多没有涉及的细节可以在用到的时候再去仔细研究。
文章看完了,不知道你对HTTP的理解有没有更上一层楼?欢迎一起交流探讨。
夫人她马甲又轰动全城了最新章节由网友提供,《夫人她马甲又轰动全城了》情节跌宕起伏、扣人心弦,是一本情节与文笔俱佳的历史小说,免费提供夫人她马甲又轰动全城了最新清爽干净的文字章节在线阅读。
(提示:已启用缓存技术,最新章节可能会延时显示,登录书架即可实时查看)
一个整数,只知道前几位,不知道末二位,被另一个整数除尽了,那么该数的末二位该是什么呢?
思路解析: 就是说输入一个被除数 a (这是差两位的数),输入一个除数b,能够整除,现在让你还原这个数。
利用的就是 从0到99循环,加在a上与b做%得到的是不是整数,是的话就输出出来。
把一个偶数拆成两个不同素数的和,有几种拆法呢?
//遍历一个数判断是否是素数,循环只要到这个数开根号就行。
Sky从小喜欢奇特的东西,而且天生对数字特别敏感,一次偶然的机会,他发现了一个有趣的四位数2992,这个数,它的十进制数表示,其四位数字之和为2+9+9+2=22,它的十六进制数BB0,其四位数字之和也为22,同时它的十二进制数表示1894,其四位数字之和也为22,啊哈,真是巧啊。Sky非常喜欢这种四位数,由于他的发现,所以这里我们命名其为Sky数。但是要判断这样的数还是有点麻烦啊,那么现在请你帮忙来判断任何一个十进制的四位数,是不是Sky数吧。
小明今年3岁了, 现在他已经能够认识100以内的非负整数, 并且能够进行100以内的非负整数的加法计算.
对于大于等于100的整数, 小明仅保留该数的最后两位进行计算, 如果计算结果大于等于100, 那么小明也仅保留计算结果的最后两位.
例如, 对于小明来说:
给定非负整数A和B, 你的任务是代表小明计算出A+B的值.
利用模除 100 不管是大于100的数还是小于100的数都可以。
首先想到的是水桶算法,利用数组,但是这道题的时间复杂度不能够接受
整数的异或是先把它们化成二进制,再按位异或。
两个相同的数异或为0,普通数都出现了偶数次,
所以它们异或后都是0,而0与那个特别数异或后还是那个特殊数。
分析:这道题求的是获胜者,前面都是获胜者,后面的都是失败者,如果前面的字符在后面能找到,那么前面的就是失败者,输入用两个数组a,b,另外一个数组a1存的是获胜者
如果最后只剩一个名字,说明有冠军,否则没有冠军
C++编程考试使用的实时提交系统,具有即时获得成绩排名的特点。它的功能是怎么实现的呢?
我们做好了题目的解答,提交之后,要么“AC”,要么错误,不管怎样错法,总是给你记上一笔,表明你曾经有过一次错误提交,因而当你一旦提交该题“AC”后,就要与你算一算帐了,总共该题错误提交了几回。虽然你在题数上,大步地跃上了一个台阶,但是在耗时上要摊上你共花去的时间。特别是,曾经有过的错误提交,每次都要摊上一定的单位时间分。这样一来,你在做出的题数上,可能领先别人很多,但是,在做出同样题数的人群中,你可能会在耗时上处于排名的劣势。
例如:某次考试一共8题(A,B,C,D,E,F,G,H),每个人做的题都在对应的题号下有个数量标记,负数表示该学生在该题上有过的错误提交次数,但到现在还没有AC,正数表示AC所耗的时间,如果正数a跟上一对括号,里面有个整数b,那就表示该学生提交该题AC了,耗去了时间a,同时,曾经错误提交了b次,因此对于下述输入数据:
有二个整数,它们加起来等于某个整数,乘起来又等于另一个整数,它们到底是真还是假,也就是这种整数到底存不存在,实在有点吃不准,你能快速回答吗?看来只能通过编程。
∴要判断是否有整数解,就要判断方程:x2 - nx + m = 0的△是否为完全平方数。
妈妈每天都要出去买菜,但是回来后,兜里的钱也懒得数一数,到底花了多少钱真是一笔糊涂帐。现在好了,作为好儿子(女儿)的你可以给她用程序算一下了,呵呵。
不吉利的数字为所有含有4或62的号码。例如:
这里的方法是暴力穷举的方法
return 1; //如果没有符合条件的那就是一个好的车牌号就是一堆砖使它们一样高最少移动多少次
输出能从花纹布中剪出的最多小饰条个数,如果一块都没有,那就老老实实输出0,每个结果之间应换行
高能质点碰击核子时,质点被吸收,放出3个高能质点和1个低能质点;
低能质点碰击核子时,质点被吸收,放出2个高能质点和1个低能质点。
假定开始的时候(0微秒)只有一个高能质点射入核反应堆,每一微秒引起一个事件发生(对于一个事件,当前存在的所有质点都会撞击核子),试确定n微秒时高能质点和低能质点的数目。
输入含有一些整数n(0≤n≤33),以微秒为单位,若n为-1表示处理结束
在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?
已经告诉你了,这是个DP的题目,你能AC吗?
input:输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。
寒假的时候,ACBOY要去拜访很多朋友,恰巧他所有朋友的家都处在坐标平面的X轴上。ACBOY可以任意选择一个朋友的家开始访问,但是每次访问后他都必须回到出发点,然后才能去访问下一个朋友。
假设有x1个字母A, x2个字母B,… x26个字母Z,同时假设字母A的价值为1,字母B的价值为2,… 字母Z的价值为26。那么,对于给定的字母,可以找到多少价值<=50的单词呢?单词的价值就是组成一个单词的所有字母的价值之和,比如,单词ACM的价值是1+3+14=18,单词HDU的价值是8+4+21=33。(组成的单词与排列顺序无关,比如ACM与CMA认为是同一个单词)。
如果给你一个11位长的手机号码,你能找出对应的短号吗?2
输入两点的坐标 求它们的角度
又到了选课的时间了,xhd看着选课表发呆,为了想让下一学期好过点,他想知道学n个学分共有多少组合。你来帮帮他吧。(xhd认为一样学分的课没区别)
为了能过个好年,xhd开始复习了,于是每天晚上背着书往教室跑。xhd复习有个习惯,在复习完一门课后,他总是挑一门更简单的课进行复习,而他复习这门课的效率为两门课的难度差的平方,而复习第一门课的效率为100和这门课的难度差的平方。xhd这学期选了n门课,但是一晚上他最多只能复习m门课,请问他一晚上复习的最高效率值是多少?
按题目的介绍,如果前一门复习的课程的难度为m,后一门为n。那他复习后一门的效率就为(m-n)*(m-n);
自然,这里的m越大,n越小,它的效率自然就越高!
而m最大值为初始状态100,因此,我们的任务就是求它这么多要复习的课程中,难度最小的一门。即最小的n。
最高效率也就是 哪一门的效率最高 不要想复杂了
还记得汉诺塔III吗?他的规则是这样的:不允许直接从最左(右)边移到最右(左)边(每次移动一定是移到中间杆或从中间移出),也不允许大盘放到小盘的上面。xhd在想如果我们允许最大的盘子放到最上面会怎么样呢?(只允许最大的放在最上面)当然最后需要的结果是盘子从小到大排在最右边。
时间过的好快,一个学期就这么的过去了,xhd在傻傻的看着表,出于对数据的渴望,突然他想知道这个表的时针和分针的夹角是多少。现在xhd知道的只有时间,请你帮他算出这个夹角。
注:夹角的范围[0,180],时针和分针的转动是连续而不是离散的。输入数据的第一行是一个数据T,表示有T组数据。每组数据有三个整数h(0 <= h < 24),m(0 <= m < 60),s(0 <= s < 60)分别表示时、分、秒。
正整数A是否能被正整数B整除
//中心花色字符和外框花色字符 //用于判断在打印图样时需不需要先换行 //若非第一个打印的图案则先换行 //开一个大小为n的字符数组 //如果外框尺寸为1则直接打印中心图案 //对外框尺寸n进行分情况讨论 //让ch2充满整个数组 //若输出的是第一行则把首元素和尾元素置为空格 //若输出的是最后一行则把首元素和尾元素置为空格t通过求距离再调用的方法
本题中"女生们只要求他答对一半或以上就算过关",因此就应该错排0个,1个,2个一直到n/2个,然后与排列数相乘再累加即可。注意这里应该选择的是组合数公式,而不是排列数公式
小兔的叔叔从外面旅游回来给她带来了一个礼物,小兔高兴地跑回自己的房间,拆开一看是一个棋盘,小兔有所失望。不过没过几天发现了棋盘的好玩之处。从起点(0,0)走到终点(n,n)的最短路径数是C(2n,n),现在小兔又想如果不穿越对角线(但可接触对角线上的格点),这样的路径数有多少?小兔想了很长时间都没想出来,现在想请你帮助小兔解决这个问题,对于你来说应该不难吧!
girls今天和大家一起去游乐场玩,终于可以坐上梦寐以求的过山车了。可是,过山车的每一排只有两个座位,而且还有条不成文的规矩,就是每个女生必须找个个男生做partner和她同坐。但是,每个女孩都有各自的想法,举个例子把,Rabbit只愿意和XHD或PQK做partner,Grass只愿意和linle或LL做partner,PrincessSnow愿意和水域浪子或伪酷儿做partner。考虑到经费问题,boss刘决定只让找到partner的人去坐过山车,其他的人,嘿嘿,就站在下面看着吧。聪明的Acmer,你可以帮忙算算最多有多少对组合可以坐上过山车吗?
这就是匈牙利算法的流程,其中找妹子是个递归的过程,最最关键的字就是“腾”字
其原则大概是:有机会上,没机会创造机会也要上
考虑一个集合 An = { 1, 2, …, n}。比如,A1={1},A3={1,2,3}。我们称一个非空子集元素的排列为一个子集序列。对所有的子序列按字典顺序排序。你的任务就是给出第m个子序列。
int t;//所求子集位于分组后的第几组; int s[25];//后面将子集按字典序分组后每组的初始首元素; s[i]=i;//每循环一次就重新归位每组首元素; s[i]=s[i+1];//在第n组中,第2个元素在第n个时变为它的下一个数 n--;//n依次递减,直到执行上面的if代码或退出
题意为,给你场上剩下的球数m , 和 a ,b 两名队员目前得分,现在假设a将
所有的球m都打入洞中,然后让你输出是否最终a的得分会超过b;总共有15个红球,和6个有颜色的球,每个红球的得分为1 ,6个有颜色的球分别为2 , 3, 4 ,5, 6, 7 ;因为 要求最大得分,需要考虑的情况有两种;A :当 m > 6时 ,应该将有颜色的球都取了,有色球得分为2 + 3 + 4 + 5 + 6 + 7 ,有色球总得分为27 ;然后再取红球 m - 6 B:当 m
<= 6 时 ,应该由价值最高的黑球( 7 分) 向前依次增加求和,又因为有色球满足等差数列 ,由前6项减去前 6 - m项和,所以求得为( 7 - m + 1 + 7 ) * m / 2 ( 这里直接通过得分来计算的)。因此,第二种情况的得分为( 15 - m ) *m/ 2。
本题目包含多组测试,请处理到文件结束。每个测试包括四行:
第一行是一个整数L代表跑道的总长度
第二行包含三个整数N,C,T,分别表示充电站的个数,电动车冲满电以后能行驶的距离以及每次充电所需要的时间
第三行也是三个整数VR,VT1,VT2,分别表示兔子跑步的速度,乌龟开电动车的速度,乌龟脚蹬电动车的速度
第四行包含了N(N<=100)个整数p1,p2…pn,分别表示各个充电站离跑道起点的距离,其中0<p1<p2<… 其中每个数都在32位整型范围之内。
给出两个矩形在对角线上的顶点的坐标,要求你计算两个矩形的公共部分的面积。
给你两个数A和B,如果A等于B就输出"YES",否则输出"NO"。 字符处理 猜也能猜到,本题的数据不可能是简单到直接能保存进整型里。
它可能有10000位的长度,所以需要保存到字符串里。
比较的时候,需要注意的是:像0001.00与1是相同的。
很明显,当添加第n条直线时,为了使平面最多,则第n条直线要与前面n-1条直线都相交,切没有任何三条线交于一个点。
这样,第n条直线一共有n-1个交点。我们知道,增加n个焦点,则增加n+1个平面。
熟悉了线分割平面,现在,我们再来看看,每次增加的不是一条直线,而是两条相互平行的线,那又如何呢?
当第N次添加时,前面已经有2N-2条直线了,按我们上面讨论的知道,第N次添加时,第2N-1条直线和第2N条直线各能增加2(n-1)+1个平面。
现在我们再来看如果把每次加进来的平行边让它们一头相交,情况又如何呢?
我们看到,平面1、3已经合为一个面,既少了一个面。因此,每当一组平行线相交后,就会减少一个面。
因此,本题所要求的折线分割平面,自然就是上面求的的平行线分割平面数减去N。
依然是错排问题,方法见2048题。但这里还要从N个新郎中找出M个冤大头。
有参加晚会的人员都将一张写有自己名字的字条放入抽奖箱中;
然后,待所有字条加入完毕,每人从箱中取一个字条;
最后,如果取得的字条上写的就是自己的名字,那么“恭喜你,中奖了!”
N张票的所有排列可能自然是Ann = N!种排列方式
现在的问题就是N张票的错排方式有几种。
首先我们考虑,如果前面N-1个人拿的都不是自己的票,即前N-1个人满足错排,现在又来了一个人,他手里拿的是自己的票。
只要他把自己的票与其他N-1个人中的任意一个交换,就可以满足N个人的错排。这时有N-1种方法。
另外,我们考虑,如果前N-1个人不满足错排,而第N个人把自己的票与其中一个人交换后恰好满足错排。
这种情况发生在原先N-1人中,N-2个人满足错排,有且仅有一个人拿的是自己的票,而第N个人恰好与他做了交换,这时候就满足了错排。
因为前N-1个人中,每个人都有机会拿着自己的票。所以有N-1种交换的可能。
第N张牌的排列可以又N-1张牌的排列再在末尾加上一张竖的牌。这样依然合法。
也可以在N-2张合法排列的牌后面加上两张横着放的牌(如果竖着放就和上面一种重复了)。
即又是一个斐波那契数列。
数组F[i]保存i个方格有多少种填涂方法。
n个方格可以由n-1个方格和n-2个方格填充得到。
比如,在一涂好的n-1个格子里最后再插入一个格子,就得到了n个格子了。
因为已经填好n-1的格子中,每两个格子的颜色都不相同。
所以只能插入一种颜色。而n-1个格子一共有F[n-1]种填涂方法。所以从n-1格扩充到n格共有F(n-1)种方法。
若前n-1不合法,而添加一个后变成合法,即前n-2个合法,而第n-1个与第1个相同。
一只蜜蜂可以往下一格走,也可以往图的右边走。
蜜蜂在1格里,它可以往2、3两格里爬。
蜜蜂在6格里,它可以往7、8两格里爬。
所以在第n格里蜜蜂可以爬到第n+1, n+2格子里。
因此,这又是一个斐波那契数。
1).密码长度大于等于8,且不要超过16。
(2).密码中的字符应该来自下面“字符类别”中四组中的至少三组。
这四个字符类别分别为:
收费员就将他的羊拿走一半,看到老汉泪水涟涟,犹豫了一下,又还给老汉一只。巧合的是,后面每过一个收费站,都是拿走当时羊的一半,然后退还一只,等到老汉到达市场,就只剩下3只羊了。
算一下老汉最初有多少只羊吗?
输入数据第一行是一个整数N,下面由N行组成,每行包含一个整数a(0<a<=30),表示收费站的数量。
直拉从后往前推,不解释。
有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?
由题目可知,每次只能走一级或两级。
因此从第一级走上第二级只能走一步,只有1种走法。
从第一级走上第三级,可以从第一级直接走两步,也可以从第二级走一步。有2种走法
走上第n级,可以从第n-1级走一步上来,也可以从第n-2级走两步上来。
古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为:
而284的所有真约数为1、2、4、71、 142,加起来恰好为220。人们对这样的数感到很惊奇,并称之为亲和数。一般地讲,如果两个数中任何一个数都是另一个数的真约数之和,则这两个数就是亲和数。
你的任务就编写一个程序,判断给定的两个数是否是亲和数
给定三条边,请你判断一下能不能组成一个三角形。 读数据的时候,不要忘了三条边要用实数型,而不是整型。_
你会合理安排吗?(目标是能看尽量多的完整节目)
输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
求A^B的最后三位数表示的整数。
说明:A^B的含义是“A的B次方”
A-B求的是两个集合的差,就是做集合的减法运算。
A中的元素减去B中有的
直接用C语言去模拟一个集合,然后每读入一个数字,做一次遍历,如果找到就删除。最后才排一次序输出。
这个题目的A和B不是简单的整数,而是两个时间,A和B 都是由3个整数组成,分别表示时分秒,比如,假设A为34 45 56,就表示A所表示的时间是34小时 45分钟 56秒。
我们平时用的是十进制,规则是逢10进1,而时间是六十进制,就是逢60进1位。
本题就是让你做一个60进制的加法运算。
法一:传统二维数组的方法
输入一个十进制数N,将它转换成R进制数输出。
【数制换算的一般方法】
1.把r进数转换成十进制数,只要把r进制数写成r的各次幂的和的形式。然后按十进制计算结果。(这里r是大于1的自然数)
2.把十进制换成r进制,可以把十进制化成r的各次幂(各次幂的系数小于r而大于或等于0的整数)的和,从最高次幂起各次幂的系数就是依次的r进制从左到右各个数位上的数字。
A.当十进制数是整数时,采用“r除取余”法。即用数r除十进整数。取它的每次余数。
例如:把(746)10化为一个八进制的数。
B.当十进制是小数时,采用“r乘取整”法,即用数r乘十进制小数,每乘一次取一次整数,直至小数部分变成零为止。
C.把r1进制数转换成r2进制数,一般可以先把r1进制数转换成十进制数,再从十进制数转换成r2进制数。
从上面的算法可以看出,数制转换需要逆序输出,就需要用到栈。所以我们直接用递归调用了。
汉字占双字节,高位的字节里都是 < 0,所以只要统计小于0的字符的个数
n个数的最小公倍数 这里 还是用辗转相除法
统计每个元音字母在字符串中出现的次数。
也许字母会有大小写之分,记得用**tolower()或toupper()**换成统一的格式就可以了 很重要的
- 输入一个英文句子,将每个单词的第一个字母改成大写字母。
- 问题的关键在于如何判断为单词的首字母。
方法也不难,只要你判断当前字符为字母,而前一个为空格就可以了。
为了简单处理整个字符串的第一个字符。你可以让保存前一个字符的变量初始为空格。
这样就可以把判断规则统一起来了,不用特殊处理字符串的第一个字符。
假设一个班有n(n<=50)个学生,每人考m(m<=5)门课,求每个学生的平均成绩和每门课的平均成绩,并输出各科成绩均大于等于平均成绩的学生数量。
对于每个测试实例,输出3行数据,第一行包含n个数据,表示n个学生的平均成绩,结果保留两位小数;第二行包含m个数据,表示m门课的平均成绩,结果保留两位小数;第三行是一个整数,表示该班级中各科成绩均大于等于平均成绩的学生数量。
输入行列 代表这个女猪脚的坐标,选择一个绝对值最大的人当作猪脚。
虽然这题算法简单,但是会有一个陷阱!
我们知道,有符号long型能表示的范围是- ~ 。你会发现。负数的范围其实比正数大。
所以,如果你直接用long型,然后用abs来取绝对值,就可能造成数据溢出。你可以自己试一下输出abs(-)的值。
解决方法是可以用double型来替换它
这道题可以简化为给定面额,求需要的人民币的张数。
用的方法是贪心。这不难理解,用的人民币的面值越大,当然张数就越少。
输入数据包含多个测试实例,每个测试实例的第一行是一个整数n(n<100),表示老师的人数,然后是n个老师的工资。 n=0表示输入的结束,不做处理。
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
输入n(n<100)个数,找出其中最小的数,将它与最前面的数交换后输出这些数。
有一个长度为n(n<=100)的数列,该数列定义为从2开始的递增有序偶数,现在要求你按照顺序每m个数求出一个平均值,如果最后不足m个,则以实际数量求平均值。输出该平均值序列
// 求和项达到m项,则计算平均值并输出 // 最后一个平均值:如果n是m的倍数则最后一项已经输出,否则输出最后一项。换行。版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。