`
kmplayer
  • 浏览: 512181 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
文章列表
1,问题一: N的阶乘N!末尾有多少个0呢? 解答:问题可转化为N!的质因数分解中5的个数. int ZeroNum(int n) { int ret; //注:第一次循环表示5^1的倍数,每个贡献一个5 //第二次表示5^2的倍数,也会额外多贡献一个5 //...一次类推 while (n) { n /= 5; ret += n; } return ret; } 2,问题2: 求N!的二进制表示中的最低位1的位置. 解答:问题转化为求质因数分解中1的个数. 方法1同上 ...
1,给一个打表和暴力折中的方法: 打表countTable[256]:存放0到255中1的个数 则有: int IntBitNum(int v) { int ret = 0; while(v) { ret += countTable[v & 0x0f]; v >> 4; } return ret; } 2,HAKMEM算法(计算32位整型数中的'1'的个数)

滑动窗口

1,滑动窗口(Sliding window )是一种流量控制技术。 2,滑动窗口协议是用来改善吞吐量的一种技术,即容许发送方在接收任何应答之前传送附加的包。接收方告诉发送方在某一时刻能送多少包(称窗口尺寸)。 3,TCP中采用滑动窗口来进行传输控制,滑动窗口的大小意味着接收方还有多大的缓冲区可以用于接收数据。发送方可以通过滑动窗口的大小来确定应该发送多少字节的数据。当滑动窗口为0时,发送方一般不能再发送数据报,但有两种情况除外,一种情况是可以发送紧急数据,例如,允许用户终止在远端机上的运行进程。另一种情况是发送方可以发送一个1字节的数据报来通知接收方重新声明它希望接收的下一字节及发送方的滑动窗口 ...
1,IP包头结构如下图所示 2,下面具体分析IP包头中各部分的作用。 版本号(Version):长度4比特。标识目前采用的IP协议的版本号。一般的值为0100(IPv4),0110(IPv6) IP包头长度(Header Length):长度4比特。这个字段的作用是为 ...

三次握手

1,在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接。   第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。   第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态; 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISH ...
1,IP是由四段数字组成,在此,先来了解一下3类常用的IP: A类IP段  1.0.0.0 到127.255.255.255 B类IP段  128.0.0.0 到191.255.255.255 C类IP段  192.0.0.0 到223.255.255.255 2,XP默认分配的子网掩码每段只有255或0 A类的默认子网掩码 255.0.0.0     一个子网最多可以容纳1677万多台电脑 B类的默认子网掩码 255.255.0.0    一个子网最多可以容纳6万台电脑 C类的默认子网掩码 255.255.255.0   一个子网最多可以容纳254台电脑 3,要想在同一 ...
1,一个例子: #include <stdio.h> union { struct s { unsigned X1:2; //8bit的低2位 unsigned X2:3; unsigned X3:3; //8bit的高3位 }S; char c; }X; // 01100100 int main() { X.c = 100; printf("%x\n", X.c); printf("%d\n ...
1,题意: 输入数字n,按顺序输出从1最大的n位10进制数。比如输入3,则输出1、2、3一直到最大的3位数即999。 2,用递归可以比较简短地实现: #include <iostream> #include <cstring> using namespace std ; void OutPut(char* number) { bool isBegin = true; int nLength = strlen(number); for(int i = 0; i < nLength; ++ i) { ...
1,首先想到的是在C++ 中,子类的构造函数会自动调用父类的构造函数。同样,子类的析构函数也会自动调用父类的析构函数。要想一个类不能被继承,我们只要把它的构造函数和析构函数都定义为私有函数。那么当一个类试图从 ...
1,题意: 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。 2,分析: (1)各个元素依次异或,得到两个数字异或的结果 val. (2)找到val的一个bit为1的位. (3)根据上述比特位1或0将原来的数组分成两组. (4)每组异或,即可得到要求的数. 3,实例代码: #include <iostream> #include <cstring> using namespace std; void findOnce(int data[], int n, in ...
1,老题目了,给个自己的版本. #include <iostream> #include <cstring> using namespace std; void Reverse(char* b, char* e) { if ((b == NULL) || (e == NULL)) return ; while (b < e) { *b ^= *e; *e ^= *b; *b ^= *e; ++b; --e; ...

寻找丑数

1,题意: 把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。 返回第n个丑数. 2,分析: //类似于筛法寻找素数 创建一个数组,里面的数字是排好序的丑数。里面的每一个丑数是前面的丑数乘以2、3或者5得到的。 我们假设数组中已经有若干个丑数,排好序后存在数组中。现在我们来生成下一个丑数,该丑数肯定是前面某一个丑数乘以2、3或者5的结果。 从1开始,每个数分别乘以一次2,3,5,会贡献3个丑数. 贡献后,对应的index2或index3或index5就右移一位. 3,实现代码: #incl ...
1,分析: 首尾两个游标. 如果当前sum < n, 尾巴向右移动. 如果当前sum > n, 首向右移动. 如果当前sum == n,输出结果. 首向右移动两位,尾巴向右移动一位. 循环条件: 首 < (n+1)/2 2,实现代码: #include <iostream> using namespace std; void FindContinuousSum(int n) { if (n < 3) return; int val = (n + 1) / 2; int l = 1; in ...
1, 题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。 输入n,打印出S的所有可能的值出现的次数. 2,分析: 要求出n个骰子的点数和,我们可以先把n个骰子分为两堆:第一堆只有一个,另一个有n-1个。单独的那一个有可能出现从1到6的点数。我们需要计算从1到6的每一种点数和剩下的n-1个骰子来计算点数和。接下来把剩下的n-1个骰子还是分成两堆,第一堆只有一个,第二堆有n-2个。我们把上一轮那个单独骰子的点数和这一轮单独骰子的点数相加,再和剩下的n-2个骰子来计算点数和。分析到这里,我们不难发现,这是一种递归的思路。递归结束的条件就是最后只剩下一个骰子了。 即:f(n, num) = f ...
#include <winsock2.h> #include <stdio.h> #include <stddef.h> #define QUEUE_LEN 100 int main() { WSADATA wsaData; WORD sockVersion=MAKEWORD(2,2); int local_port; SOCKET localtcpsocket; struct sockaddr_in mysock_addr; if(WSAStartup(sockVersion, & ...
Global site tag (gtag.js) - Google Analytics