定义:设a对b的乘法逆元是x则可以记为a*x=1 mod b,即a和x的积除以b的余数是1;
乘法逆元常用算法是欧几里德算法:
//算法求d关于模f的乘法逆元d-1 ,即 d* d-1 mod f = 1
1 。(X1,X2,X3) := (1,0,f); (Y1,Y2,Y3) := (0,1,d)
2。 if (Y3=0) then return d-1 = null //无逆元
3。 if (Y3=1) then return d-1 = Y2 //Y2为逆元
4。 Q := X3 div Y3 //整除
5。 (T1,T2,T3) := (X1 - Q*Y1,X2 - Q*Y2,X3 - Q*Y3)
6 。(X1,X2,X3) := (Y1,Y2,Y3)
7。 (Y1,Y2,Y3) := (T1,T2,T3)
8。 goto 2
常用于加密算法中,如仿射算法。
采用扩展欧几里德算法
首先,欧几里德算法又称辗转相除法,用于求最大公约数,算法如下:
int Gcd(int a, int b)
{
if(b == 0)
return a;
return Gcd(b, a % b);
}
求一个数对另一个数的乘法逆元算法如下:
Typedef unsigned short int uint16;
uint16 mulinv(uint16 b,uint16 a) //求一个整数b对a的乘法逆元 ......
转帖http://www.cppblog.com/bidepan2023/archive/2008/01/22/41632.html
CSocket派生于CAsyncSocket, 所有施诸于上的操作皆为同步操作。比如Connnect,Receive等。
同步操作的优点是简单易用,但缺点也显而易见,效率低下,因为你必须等到一个操作完成之后才能进行下一个操作。
如果你很关心效率,就应该优先使用CAsyncSocket。反之就用CSocket。
下面将说明如何用CSocket创建简单的服务器和客户端。
[创建服务器]
服务器的运作有5个阶段:
1. 创建服务器Socket并开启监听。
2. 获取新的客户端连接Socket,将之加入客户端Socket列表以管理之。
3. 客户端Socket读取数据并发送数据。
4. 客户端连接被动关闭,从列表删除。
5. 程序关闭,进而服务器连接主动关闭。
为了维持5阶段的运作,需要两种Socket协同工作, 第一种用作服务器监听(负责步骤1,2,5),第二种用作客户端管理(负责步骤3,4)。
两种Socket皆派生自CSocket, 通过重写不同的CSocket成员函数以实现不同的功能。
前者需要在服务器初始化阶段创建出来CSocket::Create()并开启监听CSocket::Listen()(步骤1)。并在服务器退出时主动关闭连接CSocket::Close()(步骤5)。
前者还需要重写OnAccept以在 ......
一直对结构体弄的模糊,今天终于有机会澄清了。有个错:不明白没有结构体名的结构体如何像结构体名一样使用。
typedf struct strcut student
{ {
int name;
......
符号
C- 意思是按住 Ctrol 键
M- 意指 Meta 键 (键盘上若无Meta 键,则可以ALT ESC 键来取而代之)
DEL 意指退格键 (不是 删除(Delete) key)
RET 意指回车键
SPC 意指空格键
ESC 意指Escape键
TAB 意指Tab键
像 "C-M-" (or "M-C") 这样连在一起的意味着同时按住 Control 和 Meta 键不放.
用方向键
C-p 、 C-b 、 C-f 和 C-n 这四个命令。它们的功能和方向键是一样的,如下图所示:
上一行 C-p (Prev line)
.
.
......
符号
C- 意思是按住 Ctrol 键
M- 意指 Meta 键 (键盘上若无Meta 键,则可以ALT ESC 键来取而代之)
DEL 意指退格键 (不是 删除(Delete) key)
RET 意指回车键
SPC 意指空格键
ESC 意指Escape键
TAB 意指Tab键
像 "C-M-" (or "M-C") 这样连在一起的意味着同时按住 Control 和 Meta 键不放.
用方向键
C-p 、 C-b 、 C-f 和 C-n 这四个命令。它们的功能和方向键是一样的,如下图所示:
上一行 C-p (Prev line)
.
.
......
用记事本写C程序,并编译。 刚装好的系统
中已经有GCC了,但是这个GCC什么文件都不能编译,因为没有一些必须的头文件,所以要安装build-essential这个软件
包,安装了这个包会自动安装上g++,libc6-dev,linux
-libc-dev,libstdc++6-4.1-dev等一些必须的软件和头文件的库。
可以在新立得里面搜索build-essential或在终端输入下面命令
:
代码:
sudo apt-get install build-essential
man 手册 查看系统调用和库函数
sudo apt-get install manpages-dev
如想查看read系统调用 可以采用 man 2 read
locate 搜索某一文件闻之
grep 搜索文件中的内容 ......
用记事本写C程序,并编译。 刚装好的系统
中已经有GCC了,但是这个GCC什么文件都不能编译,因为没有一些必须的头文件,所以要安装build-essential这个软件
包,安装了这个包会自动安装上g++,libc6-dev,linux
-libc-dev,libstdc++6-4.1-dev等一些必须的软件和头文件的库。
可以在新立得里面搜索build-essential或在终端输入下面命令
:
代码:
sudo apt-get install build-essential
man 手册 查看系统调用和库函数
sudo apt-get install manpages-dev
如想查看read系统调用 可以采用 man 2 read
locate 搜索某一文件闻之
grep 搜索文件中的内容 ......
普通变量是直接传值show(int a,int b)
指针变量传递地址show(int *a,int *b)
引用变量是隐式传地址 1:int x;void show(int &x),实际传递的是x的地址p,但是函数内部使用x时会自动变成*p
void f(int &x) {x++}; 会变成
void f(int *p) {(*p)++};
2:int *x;void show(int &x),实际已经构成了二级指针。
对二级指针的深入理解:函数间的指针引用或传递,其实质也是对地址的拷贝,即做了了副本放在引用的函数里。
#include<stdio.h&g ......