文档库 最新最全的文档下载
当前位置:文档库 › 计算机编程常用算法

计算机编程常用算法

计算机编程常用算法
计算机编程常用算法

常用算法

要使计算机能完成人们预定的工作,首先必须为如何完成预定的工作设计一个算法,然后再根据算法编写程序。计算机程序要对问题的每个对象和处理规则给出正确详尽的描述,其中程序的数据结构和变量用来描述问题的对象,程序结构、函数和语句用来描述问题的算法。算法数据结构是程序的两个重要方面。

算法是问题求解过程的精确描述,一个算法由有限条可完全机械地执行的、有确定结果的指令组成。指令正确地描述了要完成的任务和它们被执行的顺序。计算机按算法指令所描述的顺序执行算法的指令能在有限的步骤内终止,或终止于给出问题的解,或终止于指出问题对此输入数据无解。

通常求解一个问题可能会有多种算法可供选择,选择的主要标准是算法的正确性和可靠性,简单性和易理解性。其次是算法所需要的存储空间少和执行更快等。

算法设计是一件非常困难的工作,经常采用的算法设计技术主要有迭代法、穷举搜索法、递推法、贪婪法、回溯法、分治法、动态规划法等等。另外,为了更简洁的形式设计和藐视算法,在算法设计时又常常采用递归技术,用递归描述算法。

一、迭代法

迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:

(1)选一个方程的近似根,赋给变量x0;

(2)将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;

(3)当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。

若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。上述算法用C程序的形式表示为:

【算法】迭代法求方程的根

{ x0=初始近似根;

do {

x1=x0;

x0=g(x1);/*按特定的方程计算新的近似根*/

} while ( fabs(x0-x1)>Epsilon);

printf(“方程的近似根是%f\n”,x0);

}

迭代算法也常用于求方程组的根,令

X=(x0,x1,…,xn-1)

设方程组为:

xi=gi(X) (I=0,1,…,n-1)

则求方程组根的迭代算法可描述如下:

【算法】迭代法求方程组的根

{ for (i=0;i

x[i]=初始近似根;

do {

for (i=0;i

y[i]=x[i];

for (i=0;i

x[i]=gi(X);

for (delta=0.0,i=0;i

if (fabs(y[i]-x[i])>delta) delta=fabs(y[i]-x[i]);

} while (delta>Epsilon);

for (i=0;i

printf(“变量x[%d]的近似根是%f”,I,x[i]);

printf(“\n”);

}

具体使用迭代法求根时应注意以下两种可能发生的情况:

(1)如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制;

(2)方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败。

二、穷举搜索法

穷举搜索法是对可能是解的众多候选解按某种顺序进行逐一枚举和检验,并从众找出那些符合要求的候选解作为问题的解。

【问题】将A、B、C、D、E、F这六个变量排成如图所示的三角形,这六个变量分别取[1,6]上的整数,且均不相同。求使三角形三条边上的变量之和相等的全部解。如图就是一个解。

程序引入变量a、b、c、d、e、f,并让它们分别顺序取1至6的证书,在它们互不相同的条件下,测试由它们排成的如图所示的三角形三条边上的变量之和是否相等,如相等即为一种满足要求的排列,把它们输出。当这些变量取尽所有的组合后,程序就可得到全部可能的解。细节见下面的程序。

【程序1】

# include

void main()

{ int a,b,c,d,e,f;

for (a=1;a<=6;a++)

for (b=1;b<=6;b++) {

if (b==a) continue;

for (c=1;c<=6;c++) {

if (c==a)||(c==b) continue;

for (d=1;d<=6;d++) {

if (d==a)||(d==b)||(d==c) continue;

for (e=1;e<=6;e++) {

if (e==a)||(e==b)||(e==c)||(e==d) continue;

f=21-(a+b+c+d+e);

if ((a+b+c==c+d+e))&&(a+b+c==e+f+a)) {

printf(“%6d,a);

printf(“%4d%4d”,b,f);

printf(“%2d%4d%4d”,c,d,e);

scanf(“%*c”);

}

}

}

}

}

}

按穷举法编写的程序通常不能适应变化的情况。如问题改成有9个变量排成三角形,每条边有4个变量的情况,程序的循环重数就要相应改变。

对一组数穷尽所有排列,还有更直接的方法。将一个排列看作一个长整数,则所有排列对应着一组整数。将这组整数按从小到大的顺序排列排成一个整数,从对应最小的整数开始。按数列的递增顺序逐一列举每个排列对应的每个整数,这能更有效地完成排列的穷举。从一个排列找出对应数列的下一个排列可在当前排列的基础上作部分调整来实现。倘若当前排列为1,2,4,6,5,3,并令其对应的长整数为124653。要寻找比长整数124653更大的排列,可从该排列的最后一个数字顺序向前逐位考察,当发现排列中的某个数字比它前一个数字大时,如本例中的6比它的前一位数字4大,这说明还有对应更大整数的排列。但为了顺序从小到大列举出所有的排列,不能立即调整得太大,如本例中将数字6与数字4交换得到的排列126453就不是排列124653的下一个排列。为了得到排列124653的下一个排列,应从已经考察过的那部分数字中选出比数字大,但又是它们中最小的那一个数字,比如数字5,与数字4交换。该数字也是从后向前考察过程中第一个比4大的数字。5与4交换后,得到排列125643。在前面数字1,2,5固定的情况下,还应选择对应最小整数的那个排列,为此还需将后面那部分数字的排列顺序颠倒,如将数字6,4,3的排列顺序颠倒,得到排列1,2,5,3,4,6,这才是排列1,2,4,6,5,3的下一个排列。按以上想法编写的程序如下。

【程序2】

# include

# define SIDE_N 3

# define LENGTH 3

# define VARIABLES 6

int A,B,C,D,E,F;

int *pt[]={&A,&B,&C,&D,&E,&F};

int *side[SIDE_N][LENGTH]={&A,&B,&C,&C,&D,&E,&E,&F,&A};

int side_total[SIDE_N];

main{}

{ int i,j,t,equal;

for (j=0;j

*pt[j]=j+1;

while(1)

{ for (i=0;i

{ for (t=j=0;j

t+=*side[i][j];

side_total[i]=t;

}

for (equal=1,i=0;equal&&i

if (side_total[i]!=side_total[i+1] equal=0;

if (equal)

{ for (i=1;i

pri ntf(“%4d”,*pt[i]);

printf(“\n”);

scanf(“%*c”);

}

for (j=V ARIABLES-1;j>0;j--)

if (*pt[j]>*pt[j-1]) break;

if (j==0) break;

for (i=V ARIABLES-1;i>=j;i--)

if (*pt[i]>*pt[i-1]) break;

t=*pt[j-1];* pt[j-1] =* pt[i]; *pt[i]=t;

for (i=V ARIABLES-1;i>j;i--,j++)

{ t=*pt[j]; *pt[j] =* pt[i]; *pt[i]=t; }

)

}

从上述问题解决的方法中,最重要的因素就是确定某种方法来确定所有的候选解。下

面再用一个示例来加以说明。

【问题】背包问题

问题描述:有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和最大。

设n个物品的重量和价值分别存储于数组w[ ]和v[ ]中,限制重量为tw。考虑一个n 元组(x0,x1,…,xn-1),其中xi=0 表示第i个物品没有选取,而xi=1则表示第i个物品被选取。显然这个n元组等价于一个选择方案。用枚举法解决背包问题,需要枚举所有的选取方案,而根据上述方法,我们只要枚举所有的n元组,就可以得到问题的解。

显然,每个分量取值为0或1的n元组的个数共为2n个。而每个n元组其实对应了一个长度为n的二进制数,且这些二进制数的取值范围为0~2n-1。因此,如果把0~2n-1分别转化为相应的二进制数,则可以得到我们所需要的2n个n元组。

【算法】

maxv=0;

for (i=0;i<2n;i++)

{ B[0..n-1]=0;

把i转化为二进制数,存储于数组B中;

temp_w=0;

temp_v=0;

for (j=0;j

{ if (B[j]==1)

{ temp_w=temp_w+w[j];

temp_v=temp_v+v[j];

}

if ((temp_w<=tw)&&(temp_v>maxv))

{ maxv=temp_v;

保存该B数组;

}

}

}

三、递推法

递推法是利用问题本身所具有的一种递推关系求问题解的一种方法。设要求问题规模为N的解,当N=1时,解或为已知,或能非常方便地得到解。能采用递推法构造算法的问题有重要的递推性质,即当得到问题规模为i-1的解后,由问题的递推性质,能从已求得的规模为1,2,…,i-1的一系列解,构造出问题规模为I的解。这样,程序可从i=0或i=1出发,重复地,由已知至i-1规模的解,通过递推,获得规模为i的解,直至得到规模为N 的解。

【问题】阶乘计算

问题描述:编写程序,对给定的n(n≦100),计算并输出k的阶乘k!(k=1,2,…,n)的全部有效数字。

由于要求的整数可能大大超出一般整数的位数,程序用一维数组存储长整数,存储长整数数组的每个元素只存储长整数的一位数字。如有m位成整数N用数组a[ ]存储:N=a[m]×10m-1+a[m-1]×10m-2+ … +a[2]×101+a[1]×100

并用a[0]存储长整数N的位数m,即a[0]=m。按上述约定,数组的每个元素存储k的阶乘k!的一位数字,并从低位到高位依次存于数组的第二个元素、第三个元素……。例如,5!=120,在数组中的存储形式为:

3 0 2 1 ……

首元素3表示长整数是一个3位数,接着是低位到高位依次是0、2、1,表示成整数120。

计算阶乘k!可采用对已求得的阶乘(k-1)!连续累加k-1次后求得。例如,已知4!=24,计算5!,可对原来的24累加4次24后得到120。细节见以下程序。

# include

# include

# define MAXN 1000

void pnext(int a[ ],int k)

{ int *b,m=a[0],i,j,r,carry;

b=(int * ) malloc(sizeof(int)* (m+1));

for ( i=1;i<=m;i++) b[i]=a[i];

for ( j=1;j<=k;j++)

{ for ( carry=0,i=1;i<=m;i++)

{ r=(i

a[i]=r%10;

carry=r/10;

}

if (carry) a[++m]=carry;

}

free(b);

a[0]=m;

}

void write(int *a,int k)

{ int i;

printf(“%4d!=”,k);

for (i=a[0];i>0;i--)

printf(“%d”,a[i]);

printf(“\n\n”);

}

void main()

{ int a[MAXN],n,k;

printf(“Enter the number n: “);

scanf(“%d”,&n);

a[0]=1;

a[1]=1;

write(a,1);

for (k=2;k<=n;k++)

{ pnext(a,k);

write(a,k);

getchar();

}

}

四、递归

递归是设计和描述算法的一种有力的工具,由于它在复杂算法的描述中被经常采用,为此在进一步介绍其他算法设计方法之前先讨论它。

能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直接得解。

【问题】编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)。

波那契数列为:0、1、1、2、3、……,即:

fib(0)=0;

fib(1)=1;

fib(n)=fib(n-1)+fib(n-2) (当n>1时)。

写成递归函数有:

int fib(int n)

{ if (n==0) return 0;

if (n==1) return 1;

if (n>1) return fib(n-1)+fib(n-2);

}

递归算法的执行过程分递推和回归两个阶段。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是说,为计算fib(n),必须先计算fib(n-1)和fib(n-2),而计算fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。依次类推,直至计算fib(1)和fib(0),分别能立即得到结果1和0。在递推阶段,必须要有终止递归的情况。例如在函数fib中,当n为1和0的情况。

在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解,例如得到fib(1)和fib(0)后,返回得到fib(2)的结果,……,在得到了fib(n-1)和fib(n-2)的结果后,返回得到fib(n)的结果。

在编写递归函数时要注意,函数中的局部变量和参数知识局限于当前调用层,当递推进入“简单问题”层时,原来层次上的参数和局部变量便被隐蔽起来。在一系列“简单问题”层,它们各有自己的参数和局部变量。

由于递归引起一系列的函数调用,并且可能会有一系列的重复计算,递归算法的执行效率相对较低。当某个递归算法能较方便地转换成递推算法时,通常按递推算法编写程序。例如上例计算斐波那契数列的第n项的函数fib(n)应采用递推算法,即从斐波那契数列的前两项出发,逐次由前两项计算出下一项,直至计算出要求的第n项。

【问题】组合问题

问题描述:找出从自然数1、2、……、n中任取r个数的所有组合。例如n=5,r=3的所有组合为:(1)5、4、3 (2)5、4、2 (3)5、4、1

(4)5、3、2 (5)5、3、1 (6)5、2、1

(7)4、3、2 (8)4、3、1 (9)4、2、1

(10)3、2、1

分析所列的10个组合,可以采用这样的递归思想来考虑求组合函数的算法。设函数为void comb(int m,int k)为找出从自然数1、2、……、m中任取k个数的所有组合。当组合的第一个数字选定时,其后的数字是从余下的m-1个数中取k-1数的组合。这就将求m个数中取k个数的组合问题转化成求m-1个数中取k-1个数的组合问题。设函数引入工作数组a[ ]存放求出的组合的数字,约定函数将确定的k个数字组合的第一个数字放在a[k]中,当一个组合求出后,才将a[ ]中的一个组合输出。第一个数可以是m、m-1、……、k,函数将确定组合的第一个数字放入数组后,有两种可能的选择,因还未去顶组合的其余元素,继续递归去确定;或因已确定了组合的全部元素,输出这个组合。细节见以下程序中的函数comb。【程序】

# include

# define MAXN 100

int a[MAXN];

void comb(int m,int k)

{ int i,j;

for (i=m;i>=k;i--)

{ a[k]=i;

if (k>1)

comb(i-1,k-1);

else

{ for (j=a[0];j>0;j--)

printf(“%4d”,a[j]);

printf(“\n”);

}

}

}

void main()

{ a[0]=3;

comb(5,3);

}

【问题】背包问题

问题描述:有不同价值、不同重量的物品n件,求从这n件物品中选取一部分物品的选择方案,使选中物品的总重量不超过指定的限制重量,但选中物品的价值之和最大。

设n件物品的重量分别为w0、w1、…、wn-1,物品的价值分别为v0、v1、…、vn-1。采用递归寻找物品的选择方案。设前面已有了多种选择的方案,并保留了其中总价值最大的方案于数组option[ ],该方案的总价值存于变量maxv。当前正在考察新方案,其物品选择情况保存于数组cop[ ]。假定当前方案已考虑了前i-1件物品,现在要考虑第i件物品;当前方案已包含的物品的重量之和为tw;至此,若其余物品都选择是可能的话,本方案能达到的总价值的期望值为tv。算法引入tv是当一旦当前方案的总价值的期望值也小于前面方案的总价值maxv时,继续考察当前方案变成无意义的工作,应终止当前方案,立即去考察下一个方案。因为当方案的总价值不比maxv大时,该方案不会被再考察,这同时保证函数后找到的方案一定会比前面的方案更好。

对于第i件物品的选择考虑有两种可能:

(1)考虑物品i被选择,这种可能性仅当包含它不会超过方案总重量限制时才是可行的。选中后,继续递归去考虑其余物品的选择。

(2)考虑物品i不被选择,这种可能性仅当不包含物品i也有可能会找到价值更大的方案的情况。

按以上思想写出递归算法如下:

try(物品i,当前选择已达到的重量和,本方案可能达到的总价值tv)

{ /*考虑物品i包含在当前方案中的可能性*/

if(包含物品i是可以接受的)

{ 将物品i包含在当前方案中;

if (i

try(i+1,tw+物品i的重量,tv);

else

/*又一个完整方案,因为它比前面的方案好,以它作为最佳方案*/

以当前方案作为临时最佳方案保存;

恢复物品i不包含状态;

}

/*考虑物品i不包含在当前方案中的可能性*/

if (不包含物品i仅是可男考虑的)

if (i

try(i+1,tw,tv-物品i的价值);

else

/*又一个完整方案,因它比前面的方案好,以它作为最佳方案*/

以当前方案作为临时最佳方案保存;

}

为了理解上述算法,特举以下实例。设有4件物品,它们的重量和价值见表:

物品0 1 2 3

重量 5 3 2 1

价值 4 4 3 1

并设限制重量为7。则按以上算法,下图表示找解过程。由图知,一旦找到一个解,算法就进一步找更好的佳。如能判定某个查找分支不会找到更好的解,算法不会在该分支继续查找,而是立即终止该分支,并去考察下一个分支。

按上述算法编写函数和程序如下:

【程序】

# include

# define N 100

double limitW,totV,maxV;

int option[N],cop[N];

struct { double weight;

double value;

}a[N];

int n;

void find(int i,double tw,double tv)

{ int k;

/*考虑物品i包含在当前方案中的可能性*/

if (tw+a[i].weight<=limitW)

{ cop[i]=1;

if (i

else

{ for (k=0;k

option[k]=cop[k];

maxv=tv;

}

cop[i]=0;

}

/*考虑物品i不包含在当前方案中的可能性*/

if (tv-a[i].value>maxV)

if (i

else

{ for (k=0;k

option[k]=cop[k];

maxv=tv-a[i].value;

}

}

void main()

{ int k;

double w,v;

printf(“输入物品种数\n”);

scanf((“%d”,&n);

printf(“输入各物品的重量和价值\n”);

for (totv=0.0,k=0;k

{ scanf(“%1f%1f”,&w,&v);

a[k].weight=w;

a[k].value=v;

totV+=V;

}

printf(“输入限制重量\n”);

scanf(“%1f”,&limitV);

maxv=0.0;

for (k=0;k

find(0,0.0,totV);

for (k=0;k

if (option[k]) printf(“%4d”,k+1);

printf(“\n总价值为%.2f\n”,maxv);

}

作为对比,下面以同样的解题思想,考虑非递归的程序解。为了提高找解速度,程序不是简单地逐一生成所有候选解,而是从每个物品对候选解的影响来形成值得进一步考虑的候

选解,一个候选解是通过依次考察每个物品形成的。对物品i的考察有这样几种情况:当该物品被包含在候选解中依旧满足解的总重量的限制,该物品被包含在候选解中是应该继续考虑的;反之,该物品不应该包括在当前正在形成的候选解中。同样地,仅当物品不被包括在候选解中,还是有可能找到比目前临时最佳解更好的候选解时,才去考虑该物品不被包括在候选解中;反之,该物品不包括在当前候选解中的方案也不应继续考虑。对于任一值得继续考虑的方案,程序就去进一步考虑下一个物品。

【程序】

# include

# define N 100

double limitW;

int cop[N];

struct ele { double weight;

double value;

} a[N];

int k,n;

struct { int flg;

double tw;

double tv;

}twv[N];

void next(int i,double tw,double tv)

{ twv[i].flg=1;

twv[i].tw=tw;

twv[i].tv=tv;

}

double find(struct ele *a,int n)

{ int i,k,f;

double maxv,tw,tv,totv;

maxv=0;

for (totv=0.0,k=0;k

totv+=a[k].value;

next(0,0.0,totv);

i=0;

While (i>=0)

{ f=twv[i].flg;

tw=twv[i].tw;

tv=twv[i].tv;

switch(f)

{ case 1: twv[i].flg++;

if (tw+a[i].weight<=limitW)

if (i

{ next(i+1,tw+a[i].weight,tv);

i++;

}

else

{ maxv=tv;

for (k=0;k

cop[k]=twv[k].flg!=0;

}

break;

case 0: i--;

break;

default: twv[i].flg=0;

if (tv-a[i].value>maxv)

if (i

{ next(i+1,tw,tv-a[i].value);

i++;

}

else

{ maxv=tv-a[i].value;

for (k=0;k

cop[k]=twv[k].flg!=0;

}

break;

}

}

return maxv;

}

void main()

{ double maxv;

printf(“输入物品种数\n”);

scanf((“%d”,&n);

printf(“输入限制重量\n”);

scanf(“%1f”,&limitW);

printf(“输入各物品的重量和价值\n”);

for (k=0;k

scanf(“%1f%1f”,&a[k].weight,&a[k].value);

maxv=find(a,n);

printf(“\n选中的物品为\n”);

for (k=0;k

if (option[k]) printf(“%4d”,k+1);

printf(“\n总价值为%.2f\n”,maxv);

)

五、回溯法

回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,满足所有其他要求时,继续扩大当前候选解的规模,并继续试探。如果当前候选解满足包括问题规模在内的所有要求时,该候选解就是问题的一个解。在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回溯。扩大当前候选解的规模,以继续试探的过程称为向前试探。

1、回溯法的一般描述

可用回溯法求解的问题P,通常要能表达为:对于已知的由n元组(x1,x2,…,xn)组成的一个状态空间E={(x1,x2,…,xn)∣xi∈Si ,i=1,2,…,n},给定关于n元组中的一个分量的一个约束集D,要求E中满足D的全部约束条件的所有n元组。其中Si是分量xi的定义域,且|Si| 有限,i=1,2,…,n。我们称E中满足D的全部约束条件的任一n 元组为问题P的一个解。

解问题P的最朴素的方法就是枚举法,即对E中的所有n元组逐一地检测其是否满足D的全部约束,若满足,则为问题P的一个解。但显然,其计算量是相当大的。

我们发现,对于许多问题,所给定的约束集D具有完备性,即i元组(x1,x2,…,xi)满足D中仅涉及到x1,x2,…,xi的所有约束意味着j(jj。因此,对于约束集D具有完备性的问题P,一旦检测断定某个j元组(x1,x2,…,xj)违反D中仅涉及x1,x2,…,xj的一个约束,就可以肯定,以(x1,x2,…,xj)为前缀的任何n元组(x1,x2,…,xj,xj+1,…,xn)都不会是问题P的解,因而就不必去搜索它们、检测它们。回溯法正是针对这类问题,利用这类问题的上述性质而提出来的比枚举法效率更高的算法。

回溯法首先将问题P的n元组的状态空间E表示成一棵高为n的带权有序树T,把在E中求问题P的所有解转化为在T中搜索问题P的所有解。树T类似于检索树,它可以这样构造:

设Si中的元素可排成xi(1) ,xi(2) ,…,xi(mi-1) ,|Si| =mi,i=1,2,…,n。从根开始,让T的第I层的每一个结点都有mi个儿子。这mi个儿子到它们的双亲的边,按从左到右的次序,分别带权xi+1(1) ,xi+1(2) ,…,xi+1(mi) ,i=0,1,2,…,n-1。照这种构造方式,E中的一个n元组(x1,x2,…,xn)对应于T中的一个叶子结点,T的根到这个叶子结点的路径上依次的n条边的权分别为x1,x2,…,xn,反之亦然。另外,对于任意的0≤i≤n-1,E中n元组(x1,x2,…,xn)的一个前缀I元组(x1,x2,…,xi)对应于T中的一个非叶子结点,T的根到这个非叶子结点的路径上依次的I条边的权分别为x1,x2,…,xi,反之亦然。特别,E中的任意一个n元组的空前缀(),对应于T的根。

因而,在E中寻找问题P的一个解等价于在T中搜索一个叶子结点,要求从T的根到该叶子结点的路径上依次的n条边相应带的n个权x1,x2,…,xn满足约束集D的全部约束。在T中搜索所要求的叶子结点,很自然的一种方式是从根出发,按深度优先的策略逐步深入,即依次搜索满足约束条件的前缀1元组(x1i)、前缀2元组(x1,x2)、…,前缀I元组(x1,x2,…,xi),…,直到i=n为止。

在回溯法中,上述引入的树被称为问题P的状态空间树;树T上任意一个结点被称为问题P的状态结点;树T上的任意一个叶子结点被称为问题P的一个解状态结点;树T上满足约束集D的全部约束的任意一个叶子结点被称为问题P的一个回答状态结点,它对应于问题P的一个解。

【问题】组合问题

问题描述:找出从自然数1、2、……、n中任取r个数的所有组合。

例如n=5,r=3的所有组合为:

(1)1、2、3 (2)1、2、4 (3)1、2、5

(4)1、3、4 (5)1、3、5 (6)1、4、5

(7)2、3、4 (8)2、3、5 (9)2、4、5

(10)3、4、5

则该问题的状态空间为:

E={(x1,x2,x3)∣xi∈S ,i=1,2,3 } 其中:S={1,2,3,4,5}

约束集为:x1

显然该约束集具有完备性。

2、回溯法的方法

对于具有完备约束集D的一般问题P及其相应的状态空间树T,利用T的层次结构和D 的完备性,在T中搜索问题P的所有解的回溯法可以形象地描述为:

从T的根出发,按深度优先的策略,系统地搜索以其为根的子树中可能包含着回答结点的所有状态结点,而跳过对肯定不含回答结点的所有子树的搜索,以提高搜索效率。具体地说,当搜索按深度优先策略到达一个满足D中所有有关约束的状态结点时,即“激活”该状态结点,以便继续往深层搜索;否则跳过对以该状态结点为根的子树的搜索,而一边逐层地向该状态结点的祖先结点回溯,一边“杀死”其儿子结点已被搜索遍的祖先结点,直到遇到其儿子结点未被搜索遍的祖先结点,即转向其未被搜索的一个儿子结点继续搜索。

在搜索过程中,只要所激活的状态结点又满足终结条件,那么它就是回答结点,应该把它输出或保存。由于在回溯法求解问题时,一般要求出问题的所有解,因此在得到回答结点后,同时也要进行回溯,以便得到问题的其他解,直至回溯到T的根且根的所有儿子结点均已被搜索过为止。

例如在组合问题中,从T的根出发深度优先遍历该树。当遍历到结点(1,2)时,虽然它满足约束条件,但还不是回答结点,则应继续深度遍历;当遍历到叶子结点(1,2,5)时,由于它已是一个回答结点,则保存(或输出)该结点,并回溯到其双亲结点,继续深度遍历;当遍历到结点(1,5)时,由于它已是叶子结点,但不满足约束条件,故也需回溯。

3、回溯法的一般流程和技术

在用回溯法求解有关问题的过程中,一般是一边建树,一边遍历该树。在回溯法中我们一般采用非递归方法。下面,我们给出回溯法的非递归算法的一般流程:

在用回溯法求解问题,也即在遍历状态空间树的过程中,如果采用非递归方法,则我们一般要用到栈的数据结构。这时,不仅可以用栈来表示正在遍历的树的结点,而且可以很方便地表示建立孩子结点和回溯过程。

例如在组合问题中,我们用一个一维数组Stack[ ]表示栈。开始栈空,则表示了树的根结点。如果元素1进栈,则表示建立并遍历(1)结点;这时如果元素2进栈,则表示建立并遍历(1,2)结点;元素3再进栈,则表示建立并遍历(1,2,3)结点。这时可以判断它满足所有约束条件,是问题的一个解,输出(或保存)。这时只要栈顶元素(3)出栈,即表示从结点(1,2,3)回溯到结点(1,2)。

【问题】组合问题

cmd常用命令大全

windows XP cmd命令大全 一,ping 它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以确定目标主机的存在,可以初步判断目标主机的操作系统等。下面就来看看它的一些常用的操作。先看看帮助吧,在DOS窗口中键入:ping /? 回车,。所示的帮助画面。在此,我们只掌握一些基本的很有用的参数就可以了(下同)。 -t 表示将不间断向目标IP发送数据包,直到我们强迫其停止。试想,如果你使用100M 的宽带接入,而目标IP是56K的小猫,那么要不了多久,目标IP就因为承受不了这么多的数据而掉线,呵呵,一次攻击就这么简单的实现了。 -l 定义发送数据包的大小,默认为32字节,我们利用它可以最大定义到65500字节。结合上面介绍的-t参数一起使用,会有更好的效果哦。 -n 定义向目标IP发送数据包的次数,默认为3次。如果网络速度比较慢,3次对我们来说也浪费了不少时间,因为现在我们的目的仅仅是判断目标IP是否存在,那么就定义为一次吧。 说明一下,如果-t 参数和 -n参数一起使用,ping命令就以放在后面的参数为标准,比如"ping IP -t -n 3",虽然使用了-t参数,但并不是一直ping下去,而是只ping 3次。另外,ping命令不一定非得ping IP,也可以直接ping主机域名,这样就可以得到主机的IP。 下面我们举个例子来说明一下具体用法。 这里time=2表示从发出数据包到接受到返回数据包所用的时间是2秒,从这里可以判断网络连接速度的大小。从TTL的返回值可以初步判断被ping主机的操作系统,之所以说"初步判断"是因为这个值是可以修改的。这里TTL=32表示操作系统可能是win98。 (小知识:如果TTL=128,则表示目标主机可能是Win2000;如果TTL=250,则目标主机可能是Unix) 至于利用ping命令可以快速查找局域网故障,可以快速搜索最快的QQ服务器,可以对

计算机应用基础作业3

1(2分)、 2 在同一个工作簿中要引用其他工作表某个单元格的数据(如Sheet8中D 8单元格中的数据),下面的表达方式中正确的是()。 ?A、 =Sheet8!D8 ? ?B、 =D8(Sheet8) ? ?C、 +Sheet8!D8 ? ?D、 $Sheet8>$D8 ? 2.(2分)、 2 在Excel操作中,某公式中引用了一组单元格,它们是(C3:D7,A1:F1),该公式引用的单元格总数为()。 ?A、

4 ? ?B、 12 ? ?C、 16 ? ?D、 22 ? 3(2分)、 2 在同一个工作簿中区分不同工作表的单元格,要在地址前面增加()来标识。 ?A、 单元格地址 ? ?B、 公式 ? ?C、 工作表名称 ? ?D、

工作簿名称 ? 4(2分)、 2 执行"插入→工作表"菜单命令,每次可以插入()个工作表。 ?A、 1 ? ?B、 2 ? ?C、 3 ? ?D、 4 ? 5(2分)、 Excel工作表单元格中,系统默认的数据对齐是()。 ?A、 数值数据左对齐,正文数据右对齐 ?

?B、 数值数据右对齐,文本数据左对齐 ? ?C、 数值数据、正文数据均为右对齐 ? ?D、 数值数据、正文数据均为左对齐 ? 6(2分)、 2 在Excel输入数据的以下4项操作中,不能结束单元格数据输入的操作是()。 ?A、 按[Shift]键 ? ?B、 按[Tab]键 ? ?C、 按[Enter]键 ? ?D、 单击其他单元格

? 7(2分)、 在完成了图表后,想要在图表底部的网格中显示工作表中的图表数据,应该采取的正确操作是()。 ?A、 单击"图表"工具栏中的"图表向导"按钮 ? ?B、 单击"图表"工具栏中的"数据表"按钮 ? ?C、 选中图表,单击"图表"工具栏中的"数据表"按钮 ? ?D、 选中图表,单击"图表"工具栏中的"图表向导"按钮 ? 8(2分)、 2 在A1单元格中输入=SUM(8,7,8,7),则其值为()。 ?A、 15 ?

黑客计算机常用命令大全

计算机命令大全 黑客常用命令大全 net user heibai lovechina /add --------加一个heibai的用户密码为lovechina net localgroup Administrators heibai /add --------把他加入Administrator组 net start telnet --------开对方的TELNET服务 net use z:\127.0.0.1c$ --------映射对方的C盘 net user guest /active:yes --------将Guest用户激活 net user guest lovechina --------把guest的密码改为lovechina net user --------查看所有用户列表 net user --------用户名/delete 删掉 net time \\127.0.0.1-------- 得到对方的时间, get c:\index.htm d:\ --------上传的文件是INDEX.HTM,它位于C:\下,传到对方D:\ copy index.htm \\127.0.0.1\c$\index.htm --------本地C盘下的index.htm复制到127.0.0.1的C 盘 NET VIEW --------显示域列表、计算机列表 计算机运行命令全集 winver---------检查Windows版本 wmimgmt.msc----打开windows管理体系结构 wupdmgr--------windows更新程序 winver---------检查Windows版本 wmimgmt.msc----打开windows管理体系结构 wupdmgr--------windows更新程序 wscript--------windows脚本宿主设置 write----------写字板winmsd-----系统信息 wiaacmgr-------扫描仪和照相机向导 winchat--------XP自带局域网聊天 mem.exe--------显示内存使用情况 Msconfig.exe---系统配置实用程序 mplayer2-------简易widnows media player mspaint--------画图板 mstsc----------远程桌面连接 net use \\ip\ipc$ " /user:" " --------建立IPC空链接 net use \\ip\ipc$ "密码"/user:"用户名" 建立IPC非空链接 net use h: \\ip\c$ "密码"/user:"用户名" 直接登陆后映射对方C:到本地为H: net use h: \\ip\c$ --------登陆后映射对方C:到本地为H: net use \\ip\ipc$ /del --------删除IPC链接 net use h: /del --------删除映射对方到本地的为H:的映射 net user 用户名密码/add --------建立用户 net user guest /active:yes --------激活guest用户 net user --------查看有哪些用户 net user 帐户名-------- 查看帐户的属性 net localgroup administrators 用户名/add 把“用户”添加到管理员中使其具有管理员权限,

计算机编程及常用术语大全(英汉对照)

第一部分、计算机算法常用术语中英对照 Data Structures 基本数据结构 Dictionaries 字典 Priority Queues 堆 Graph Data Structures 图 Set Data Structures 集合 Kd-Trees 线段树 Numerical Problems 数值问题 Solving Linear Equations 线性方程组 Bandwidth Reduction 带宽压缩 Matrix Multiplication 矩阵乘法 Determinants and Permanents 行列式 Constrained and Unconstrained Optimization 最值问题Linear Programming 线性规划 Random Number Generation 随机数生成 Factoring and Primality Testing 因子分解/质数判定Arbitrary Precision Arithmetic 高精度计算Knapsack Problem 背包问题 Discrete Fourier Transform 离散Fourier变换Combinatorial Problems 组合问题 Sorting 排序

Searching 查找 Median and Selection 中位数 Generating Permutations 排列生成 Generating Subsets 子集生成 Generating Partitions 划分生成 Generating Graphs 图的生成 Calendrical Calculations 日期 Job Scheduling 工程安排 Satisfiability 可满足性 Graph Problems -- polynomial 图论-多项式算法Connected Components 连通分支 Topological Sorting 拓扑排序 Minimum Spanning Tree 最小生成树 Shortest Path 最短路径 Transitive Closure and Reduction 传递闭包Matching 匹配 Eulerian Cycle / Chinese Postman Euler回路/中国邮路Edge and Vertex Connectivity 割边/割点 Network Flow 网络流 Drawing Graphs Nicely 图的描绘 Drawing Trees 树的描绘 Planarity Detection and Embedding 平面性检测和嵌入

简易常用-Word文档使用技巧方法大全(超全)

Word文档使用技巧方法大全 Word2000、2003、2007、2010快捷键使用大全总结常用快捷键 快捷键作用 一、字体类 Ctrl+B 使字符变为粗体 Ctrl+I 使字符变为斜体 Ctrl+U 为字符添加下划线 Ctrl+Shift+D 双下划线 Ctrl+Shift+< 缩小字号 Ctrl+Shift+> 增大字号 Ctrl+] 逐磅增大字号 Ctrl+[ 逐磅减小字号 Ctrl+Shift+F 改变字体 Ctrl+Shift+P 改变字号 Ctrl+D 改变字符格式("格式"菜单中的"字体"命令) Shift+F3 切换字母大小写(一次首字母变成大写,两次单词变成大写) CTRL+SHIFT+A 将所选字母设为大写 二、格式类 Ctrl+Shift+C 复制格式 Ctrl+Shift+V 粘贴格式 Ctrl+1 单倍行距(1为主键盘的数字键)

Ctrl+2 双倍行距 Ctrl+5 1.5 倍行距 Ctrl+0 在段前添加一行间距 Shift+F1(单击)需查看文字格式了解其格式的文字 Ctrl+E 段落居中 Ctrl+J 两端对齐 Ctrl+L 左对齐 Ctrl+R 右对齐 Ctrl+Shift+J 分散对齐 Ctrl+M 左侧段落缩进 Ctrl+Shift+M 取消左侧段落缩进 Ctrl+T 创建悬挂缩进 Ctrl+Shift+T 减小悬挂缩进量 Ctrl+Shift+S 应用样式 Ctrl+Shift+N 应用"正文"样式 Alt+Ctrl+1 应用"标题1"样式 Alt+Ctrl+2 应用"标题2"样式 Alt+Ctrl+3 应用"标题3"样式 三、编辑和文字移动 Backspace 删除左侧的一个字符 Ctrl+Backspace 删除左侧的一个单词 Delete 删除右侧的一个字符 Ctrl+Delete 删除右侧的一个单词 F2(然后移动插入移动选取的文字或图形点并按Enter键)

常见DOS命令大全和使用方法

Windows DOS窗口打开方法,开始-运行-输入CMD-回车确认即可打开。DOS常用命令大全dos命令 dos下各种常见命令索引 ▲dir ▲attrib ▲cd ▲copy ▲xcopy ▲del ▲undelete ▲deltree ▲dos=high ▲doskey ▲emm386.exe ▲fc ▲format ▲unformat ▲interlnk ▲intersvr ▲memmaker ▲memitem等 ▲mscdex ▲msd

▲prompt ▲ramdrive ▲subst ▲mem ▲"><>><<"工具 ▲move ▲append ▲call ▲defrag ▲device 一、DIR 命令的格式: dir [D:][PATH][NAME][[/A][:attrib]][/o:[sorted][/s][/b][/l][/c[h] (1)dir /a:attrib 缺省包含所有文件(系统文件.隐含文件) attrib[:][h/-h]只显示隐含文件或非隐含文件. [r/-r]只显示只读文件或非只读文件 [s/-s]只显示系统文件或非系统文件 [a/-a]只显示要归档文件或非归档文件 (2)/o[:]sorted:缺省完全按字母顺序,子目录显示在文件之前/o[n/-n]:按字母顺序或按文件名顺序/反向显示 [e/-e]:按扩展名字母顺序/反向显示 [d/-d]:按时间顺序/反向显示 [s/-s]:按大小从大到小或/反向显示

[g/-g]:按子目录先于文件或文件先于子目录 (3)/s 参数:对当前目录及其子目录中所有文件进行列表 列名:dir /s/a/o:n c:\>PRN 将c盘上的所有子目录和文件按隶属关系并根据子目录和文件字母顺序打印输出 (4)/B 参数:将只显示文件名与扩展名 (5)/L 参数:将全部用小写字母对文件或子目录进行列表 训练: dir /a 列当前目录所有文件(含隐含及系统文件) dir /ah 列隐含文件(包含子目录(隐含的) dir /a-h dir /as 列系统文件dir /a-s dir /ad 列子目录dir /a-d dir /o 按字母顺序 dir /B 只显示文件名与扩展名 二、attrib [+r|-r] [+a|-a] [+s|-s] [+h|-h] [d: ] [name] [/s] 缺省attrib name 显示文件的(文件)属性 attrib io.sys (或子目录) shr c:\ io.sys 指定为系统(s) 隐含(h) 只读(r)文件 也可以attrib *.sys 显示扩展名为sys的文件属性 参数[+r|-r] 将文件属性设置或解除只读属性 [+a|-a] 将文件属性设置或解除归档属性 [+h|-h] 将文件属性设置或解除隐含属性(尤其对子目录也起作用) /s 参数将当前及当前子目录下的所有文件均起作用

计算机常见算法面试题

简介:计算机考研之家搜集的华为C语言经典面试题,来试试你的C语言水平吧。每道题都附有详细解答和讲解,很有参考价值的C语言面试题。 怎么判断链表中是否有环? bool CircleInList(Link* pHead) { if(pHead = = NULL || pHead->next = = NULL)//无节点或只有一个节点并且无自环 return (false); if(pHead->next = = pHead)//自环 return (true); Link *pTemp1 = pHead;//step 1 Link *pTemp = pHead->next;//step 2 while(pTemp != pTemp1 && pTemp != NULL && pTemp->next != NULL) { pTemp1 = pTemp1->next; pTemp = pTemp->next->next; } if(pTemp = = pTemp1) return (true); return (false); } 两个字符串,s,t;把t字符串插入到s字符串中,s字符串有足够的空间存放t字符串 void insert(char *s, char *t, int i) { memcpy(&s[strlen(t)+i],&s[i],strlen(s)-i); memcpy(&s[i],t,strlen(t)); s[strlen(s)+strlen(t)]='\0'; } 1。编写一个C 函数,该函数在一个字符串中找到可能的最长的子字符串,且该字符串是由同一字符组成的。 char * search(char *cpSource, char ch) { char *cpTemp=NULL, *cpDest=NULL; int iTemp, iCount=0; while(*cpSource) { if(*cpSource == ch) { iTemp = 0; cpTemp = cpSource; while(*cpSource == ch) ++iTemp, ++cpSource; if(iTemp > iCount)

加快计算机运行速度的5种简便方法

加快计算机运行速度的5种简便方法 1. 清理硬盘 硬盘上经常都充满了您并不真正需要的文件。硬盘上的东西越少,计算机的速度就会越快。 在PC 上释放空间的最佳方法是使用Windows(R) 磁盘清理实用程序。要访问该实用程序,请转到“开始”->“所有程序”->“附件”->“系统工具”,然后单击“磁盘清理”。可能需要指定要清理的驱动器。 在“磁盘清理”框中,在“要删除的文件”列表的内容中滚动,并选中要删除的项目。如果不确定要删除什么,那么最安全的是删除Internet 临时文件和已安装但不再使用的程序。完成后,单击“确定”。 如果不想同时删除某些文件,如照片和音乐或视频文件等,请考虑将其移动至外置硬盘。 2. 去除视觉效果 Windows Vista(R) 具有一些炫酷的视觉效果,但这些效果可能会耗尽系统资源。禁用其中一些将提高系统的速度。为此,请单击“开始”按钮,然后单击“控制面板”>“系统和维护”>“性能信息和工具”。 单击“调整视觉效果”。可能会要求您输入管理员密码。然后单击“视觉效果”选项卡,并选择“调整为最佳性能”。然后点击“确定”。 3. 扫描病毒和间谍软件 导致PC 性能低下的罪魁祸首之一就是恶意软件:病毒、间谍软件、特洛伊木马、蠕虫和其他种类多余的恶意软件。如果尚未安装某种防病毒保护机制,那么应该立即安装一种。请考虑使用Microsoft Windows Defender,Windows Vista 中附带此软件,也可以从Microsoft XP SP2 中免费下载。确保至少一个月安排一次自动病毒扫描。还应该将防火墙始终保持在运行状态,以便在最前线帮助阻止恶意软件进入您的PC。 4. 增加更多RAM(简单的方法) 增加系统内存(也称为RAM,或随机存取内存)可能是提高PC 性能的一个好方法。但是,升级内存有时可能比较困难和成本较高。Windows Vista 现在提供了Windows ReadyBoost,通过该技术,无须安装任何东西即可增加内存。此技术使您可以使用闪存设备,如USB 闪存驱动器或安全数字(SD) 存储卡作为额外的内存高速缓存。 5. 运行碎片整理实用程序 磁盘碎片整理程序是一个Windows 实用程序,它将计算机硬盘上的文件和文件夹整理在一起,以使每个文件占据一个单独的空间,这又会加快读写磁盘的速度。 要整理硬盘碎片,请转到“开始”>“所有程序”>“附件”>“系统工具”>“磁盘碎片整理程序”,然后选择要整理碎片的驱动器。然后转到“设置”,并确保在“整理我的硬盘碎片时”部分中的两个选项旁打上对勾,然后单击“确定”两次,开始整理。碎片整理完毕后,可能必须重新启动计算机。 遵守这些建议之后,您应该感到计算机性能有显著提高。

烽火交换机常用命令大全

求烽火交换机常用命令大全 q 接入方式 通过Console口进行本地配置 带内/带外的telnet或ssh WEB页面 q 部分有关管理的缺省设置 本机登陆用户名、密码:admin,12345或guest,12345 SNMP的只读集合:public SNMP的读写集合:NETMAN q Web页面配置 根据交换机配置的默认web管理地址通过IE浏览器进行配置 以烽火2008mfb为例 q q 设备缺省的用户名为:admin q 密码为:12345 q 选择成员及类型时,可以通过单击代表相应端口类型的字符,选择合适的配置。其中“-”代表不是该VLAN的成员,“T”代表是该VLAN的成员输出数据包带标识符,“U”代表是该VLAN的成员但输出数据包不带标识符,“T”“U”表示该接口的Pvid时该vlan。 q 查看及保存配置(特权模式下#) q show running-config 显示当前系统配置 q show startup-config 显示当前配置文件信息 q show version 显示当前设备的版本信息 q show system 显示系统配置 q show interface [<1-64>] 显示端口信息 q show vlan [<1-4094>] 显示vlan信息

q show dynamic-mac AA:BB:CC:DD:EE:FF 已知某一mac地址,查找交换机连接端口号 q show logging history 显示历史记录 q show history 显示之前的输入命令 q ls 显示文件系统 q write file 保存配置文件 q show cpu statistic 显示CPU统计信息。 q 1、设置时间 q clock set HH:MM:SS <1-31> <1-12> <2000-2100> q 例:Fengine#clock set 14:28:30 10 9 2009 q 2、显示文件系统 q dir q 例: Fengine#dir q size date time name q -------- ------ ------ -------- q 11387 JAN-01-2000 00:01:16 startcfg q 1 files, total space: 11387 bytes q 0 directorys,available space: 2011136 bytes q 3、清空交换机的配置文件 erase startup-config 用于清空flash上保存的配置文件,但是以前的配置在系统上仍然生效,因此如果希望系统恢复到出厂状态,除了需要清空flash上的配置文件外,还需要重启设备

彻底清除计算机病毒的简便方法

彻底清除计算机病毒的简便方法 目前,彻底清除计算机病毒的常用方法是:先对硬盘进行低级格式化,然后分区,最后高级格式化。这种做法不仅费时,而且也损伤硬盘。那么能否既不需要对硬盘进行低级格式化,又能彻底清除计算机病毒呢?笔者经过实践,认为答案是肯定的。因为引导型病毒主要是驻留在硬盘0柱面0磁头1扇区开始的引导区内,只要把硬盘引导区的内容全部清零,即可达到清除引导型病毒的目的。 这可用DEBUG命令编写一段小程序,并把它写入一个干净的DOS系统盘上,这种程序的功能是把硬盘引导区内所有字节全部清零,从而在清除硬盘引导区全部数据的同时也清除含在其中的病毒代码。 由于该程序很短,可用无毒DOS系统盘启动计算机后调用该盘0的DEBUG命令编写的如下一段程序并把它写入磁盘,具体操作为: A:\>DEBUG -A100 0100 MOV CX,0200 ;清除1个扇区(512个单元) MOV DI,0200 ;内存起始地址为0200H,送于DI寄存器中 MOV AL,00 ;把立即数00存放到寄存器AL中 0108 MOV [DI],AL ;把AL中的数据写入DI所指的内存单元中 INC DI ; 内存地址加1 DEC CX ; 内存单元个数减1

JNZ 0108 ;不为零转移 MOV AX,0301 ;AH=03是写盘,AL=01是写入一个扇区 MOV BX,0200 ;BX=0200是从内存0200H处开始读数据 MOV CX,0001 ;LH=00为0磁头,CL=01为第一个扇区 MOV DX,0080 ;DH=00为0柱面,DL=80为硬盘 INT 13 ;调用DOS软中断之硬盘读写控制程序 011D INT 20 ;程序运行结束 -N A: https://www.wendangku.net/doc/5d2660191.html,;给文件命名,意为:对C盘引导区填满零 -BBX BX 0000 :00 -RCX CX 0000 :ID ;输入文件长度10个字节 -W ;写盘 Writing 0001D bytes -Q A:\> 至此,清除硬盘引导区程序https://www.wendangku.net/doc/5d2660191.html,已建立在A盘上。 为了确保计算机能真正做到干净无毒,除了应清除硬盘引导区病毒外,还应清除驻留在CMOS 芯片里的病毒。否则,当计算机启动读取CMOS信息时,病毒将从CMOS芯片中被引入到内存

CMD常用命令大全(最新整理)

说起cmd大家都很熟悉吧很有用哦这里我为大家接扫常见的命令 dos命令[只列出我们工作中可能要用到的] cd\ '返回到根目录 cd.. '返回到上一级目录 1、cd 显示当前目录名或改变当前目录。 2、dir 显示目录中的文件和子目录列表。 3、md 创建目录。 4、del 删除一或数个文件。 5、chkdsk 检查磁盘并显示状态报告。 6、cacls 显示或者修改文件的访问控制表(ACL) 7、copy 将一份或多份文件复制到另一个位置。 8、date 修改日期 9、format 格式化磁盘 10、type 显示文本文件的内容。 11、move 移动文件并重命名文件和目录。 12、expand 展开一个或多个压缩文件。 13、ren 重命名文件。 14、attrib 显示或更改文件属性。 15、time 显示或设置系统时间。 16、at at命令安排在特定日期和时间运行命令和程序。要使用AT 命令,计划服务必须已在运行中。 17、net [user],[time],[use] 多,自己去查 18、netstat 显示协议统计和当前tcp/ip连接 19、nbtstat 基于NBT(net bios over tcp/ip)的协议统计和当前tcp/ip连接 20、route 操作和查看网络路由表 21、ping 就不说了,大家都熟悉吧 22、nslookup 域名查找 23、edit 命令行下的文本编辑器 24、netsh强大的命令行下修改tcp/ip配置的工具 25、fdisk 相信现在用的人比较少了,不过在没有其他工具的情况,他还是有用的 更多: attrib 设置文件属性 ctty 改变控制设备 defrag 磁盘碎片整理 doskey 调用和建立DOS宏命令 debug 程序调试命令

VB程序设计的常用算法

VB程序设计的常用算法 算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。 一、计数、求和、求阶乘等简单算法 此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。 例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。 本题使用数组来处理,用数组a(1 to 100)存放产生的确100个随机整数,数组x(1 to 10)来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。即个位是1的个数存放在x(1)中,个位是2的个数存放在x(2)中,……个位是0的个数存放在x(10)。 将程序编写在一个GetTJput过程中,代码如下: Public Sub GetTJput() Dim a(1 To 100) As Integer Dim x(1 To 10) As Integer Dim i As Integer, p As Integer '产生100个[0,99]范围内的随机整数,每行10个打印出来 For i = 1 To 100 a(i) = Int(Rnd * 100) If a(i) < 10 Then Form1.Print Space(2); a(i); Else Form1.Print Space(1); a(i); End If If i Mod 10 = 0 Then Form1.Print Next i '统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数,并将统计结果保存在数组x(1),x(2),...,x(10)中,将统计结果打印出来 For i = 1 To 100 p = a(i) Mod 10 ' 求个位上的数字 If p = 0 Then p = 10 x(p) = x(p) + 1 Next i Form1.Print "统计结果" For i = 1 To 10 p = i If i = 10 Then p = 0 Form1.Print "个位数为" + Str(p) + "共" + Str(x(i)) + "个" Next i End Sub 二、求两个整数的最大公约数、最小公倍数 分析:求最大公约数的算法思想:(最小公倍数=两个整数之积/最大公约数) (1) 对于已知两数m,n,使得m>n; (2) m除以n得余数r; (3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4); (4) m←n,n←r,再重复执行(2)。 例如:求m=14 ,n=6的最大公约数. m n r

计算机基础试卷6

第四章: 一·选择题(将选中的序号填入括号中,每题1分,共20分) 1.Excel工作表的最后一个单元格的地址是___A___ 。 A.IV65536 B.IU65536 C.IU65535 D.IV65535 2.日期2005-1-30在Excel系统内部存储的格式是__D____ 。 A.2005.1.30 B. 1,30,2005 C.2005,1,30 D.2005-1-30 3. 新建工作簿文件后,默认第一张工作簿的名称是___C___ 。 A.Book B.表 C.Book1 D.表1 4. 在工作表中要创建图表时最常使用的工具是_C_____ 。 A."常用"工具栏中的"图表"按钮 B."常用"工具栏中的"绘图"按钮 C."常用"工具栏中的"图表向导"按钮 D."常用"工具栏中的"图片"按钮 5. 若在数值单元格中出现一连串的“###”符号,希望正常显示则需要___B___ 。 A.重新输入数据 B.调整单元格的宽度 C.删除这些符号 D.删除该单元格 6. 在Excel中,一个数据清单由___D___ 3个部分组成。 A.数据、公式和函数 B.公式、记录和数据库 C.工作表、数据和工作薄 D.区域、记录和字段 7. 一个单元格内容的最大长度为__D____ 个字符。 A.64 B.128 C.225 D.256 8.下列操作中,不能退出Excel的操作是__A____ 。 A.执行"文件→关闭"菜单命令 B.执行"文件→退出"菜单命令 C.单击标题栏左端Excel窗口的控制菜单按钮,选择"关闭"命令 D.按快捷键[Alt]+[F4] 9.在单元格中输入___B___ ,使该单元格的值为8。 A.="160/20" B.=160/20 C.160/20 D."160/20"

计算机基础 第5章 真题整理

D[24].下列关于简单文本与丰富格式文本的论述,错误的是___________。 A.简单文本由一连串用于表达正文内容的字符的编码组成,它几乎不包含任何其他的格式信息和结构信息 B.为了使文本能以整齐、美观的形式展现给用户,人们还需要对文本进行排版 C.Windows操作系统中的"帮助"文件(.hlp文件)是一种丰富格式文本 D.使用微软公司的Word软件生成的DOC文件,与使用记事本生成的TXT文件一样,都属于简单文本文件超文本 [26].Windows操作系统中的"帮助"文件(HLP文件)也是一种文本,其类型属于_____。 A[14]. 就文本格式而言,下列关于标记与标记语言的叙述,错误的是__________。 A.所有标记及其使用规则都称为"标记语言",不同的文字处理软件使用的标记语言都是统一的 B.标记用来说明文本的版面结构、内容组织、文字的外貌属性等。一般来说,丰富格式文本除了包含 正文外,还包含许多标记 C.Word所使用的标记语言是微软公司专用的,它与Adobe公司Acrobat所使用的标记语言不兼容 D.超文本标记语言HTML和可扩展的标记语言XML是用于Web网页的标准标记语言 D[24]. 使用计算机进行文本编辑与文本处理是常见的两种操作,下面属于文本处理操作的是_________。 A.设置页面版式 B、设置文章标题首行居中 C、设置文本字体格式 D、文语转换 D[44].下列丰富格式文本文件中,不能用Word文字处理软件打开的是_______文件。 A.HTML格式 B、RTF格式 C、DOC格式 D、PDF格式 B[9].中文Word是一个功能丰富的文字处理软件,下面的叙述中错误的是________。 A.在文本编辑过程中,它能做到“所见即所得” B.在文本编辑过程中,操作发生错误后不能“回退”(Undo) C.它可以编辑制作超文本 D.它不但能进行编辑操作,而且能自动生成文本的“摘要” D[25]. 文本编辑与排版操作的目的是使文本正确、清晰、美观,下列_____操作不属于文本编辑排版操作。 A.添加页眉和页脚 B、设置字体和字号 C、设置行间距,首行缩进 D、对文本压缩 B[18]. 下列________图像文件格式大量用于扫描仪和桌面出版。 A.BMP B、TIF C、GIF D、JPEG C[29].数字图像的获取步骤大体分为四步,以下顺序正确的是__________。 A.扫描分色量化取样 B、分色扫描量化取样 C、扫描分色取样量化 D、量化取样扫描分色 C[14]. 为了与使用数码相机、扫描仪得到的取样图像相区别,计算机合成图像也称为__________ 。 A.位图图像 B、3D图像 C、矢量图形 B[15]. 若中文Windows 环境下西文使用标准ASCII码,汉字采用GB2312编码,设有一段简单文本的内码为CB F5 D0 B4 50 43 CA C7 D6 B8,则在这段文本中,含有________。 A、2个汉字和1个西文字符 B、4个汉字和2个西文字符 C、8个汉字和2个西文字符 D、4个汉字和1个西文字符 D[18].下列静态图像文件格式中,在Internet上大量使用的是________。 A.Swf B、Tif C、bmp D、jpg D[6]. 目前有许多不同的图像文件格式,下列________不属于图像文件格式。 A.TIF B、JPEG C、GIF D、PDF D[13]. 一幅具有真彩色(24位)、分辨率为1024╳768的数字图象,在没有进行数据压缩时,它的数据量大约是________ 。 A.900KB B、18MB C、3.75MB D、2.25MB C[40].在计算机中广泛使用的ASCII码,其中文含义是________。 A.二进制编码 B、常用的字符编码 C、美国标准信息交换码 D、汉字国标码 D[15].汉字从键盘录入到存储,涉及汉字输入码和汉字________ 。 A.DOC码 B、ASCII码 C、区位码 D、机内码 B[31].若内存中相邻2个字节的内容其十六进制形式为74和51,则它们不可能是________

单片机常用的14个C语言算法,看过的都成了大神!

单片机常用的14个C语言算法,看过的都成了大神! 算法(Algorithm):计算机解题的基本思想方法和步骤。算法的描述:是对要解决一个问题或要完成一项任务所采取的方法和步骤的描述,包括需要什么数据(输入什么数据、输出什么结果)、采用什么结构、使用什么语句以及如何安排这些语句等。通常使用自然语言、结构化流程图、伪代码等来描述算法。一、计数、求和、求阶乘等简单算法此类问题都要使用循环,要注意根据问题确定循环变量的初值、终值或结束条件,更要注意用来表示计数、和、阶乘的变量的初值。例:用随机函数产生100个[0,99]范围内的随机整数,统计个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数并打印出来。本题使用数组来处理,用数组a[100]存放产生的确100个随机整数,数组x[10]来存放个位上的数字分别为1,2,3,4,5,6,7,8,9,0的数的个数。即个位是1的个数存放在x[1]中,个位是2的个数存放在x[2]中,……个位是0的个数存放在x[10]。 void main(){int a[101],x[11],i,p;for(i=0;in; (2) m除以n得余数r; (3) 若r=0,则n为求得的最大公约数,算法结束;否则执行(4); (4) m←n,n←r,再重复执行(2)。例如: 求m="14" ,n=6 的最大公约数. m n r 14 6 2 6 2 0 void main() { int nm,r,n,m,t; printf("please input two numbers:\n"); scanf("%d,%d", nm=n*m; if (m{ t="n"; n="m"; m="t"; } r=m%n; while (r!=0) { m="n"; n="r"; r="m"%n; } printf("最大公约数:%d\n",n); printf("最小公倍数:%d\n",nm/n); } 三、判断素数只能被1或本身整除的数称为素数基本思想:把m作为被除数,将2—INT()作为除数,如果都除不尽,m就是素数,否则就不是。(可用以下程序段实现) void main() { int m,i,k; printf("please input a number:\n"); scanf("%d", k=sqrt(m); for(i=2;iif(m%i==0) break; if(i>=k) printf("该数是素数"); else printf("该数不是素数"); } 将其写成一函数,若为素数返回1,不是则返回0 int prime( m%) {int i,k; k=sqrt(m); for(i=2;iif(m%i==0) return 0; return 1; } 四、验证哥德巴赫猜想(任意一个大于等于6的偶数都可以分解为两个素数之和)基本思想:n为大于等于6的任一偶数,可分解为n1和n2两个数,分别检查n1和n2是否为素数,如都是,则为一组解。如n1不是素数,就不必再检查n2是否素数。先从n1=3开始,检验n1和n2(n2=N-n1)

计算机操作系统简单介绍

计算机操作系统简单介绍 操作系统的种类繁多,依其功能和特性分为分批处理操作系统、分时操作系统和实时操作系统等;依同时管理用户数的多少分为单用户操作系统和多用户操作系统;适合管理计算机网络环境的网络操作系统。 1)微机操作系统随着微机硬件技术的发展而发展,从简单到复杂。Microsoft 公司开发的DOS是一单用户单任务系统,而Windows操作系统则是一多户多任务系统,经过十几年的发展,已从Windows 3.1发展Windows NT、Windows 2000、Windows XP、Windows vista、Windows 7和Windows 8等等。它是当前微机中广泛使用的操作系统之一。Linux是一个源码公开的操作系统,程序员可以根据自己的兴趣和灵感对其进行改变,这让Linux吸收了无数程序员的精华,不断壮大,已被越来越多的用户所采用,是Windows操作系统强有力的竞争对手。 2)语言处理系统 人和计算机交流信息使用的语言称为计算机语言或称程序设计语言。计算机语言通常分为机器语言、汇编语言和高级语言三类。如果要在计算机上运行高级语言程序就必须配备程序语言翻译程序(下简称翻译程序)。翻译程序本身是一组程序,不同的高级语言都有相应的翻译程序。翻译的方法有两种:一种称为“解释”。早期的BASIC源程序的执行都采用这种方式。它调用机器配备的BASIC“解释程序”,在运行BASIC源程序时,逐条把BASIC的源程序语句进行解释和执行,它不保留目标程序代码,即不产生可执行文件。这种方式速度较慢,每次运行都要经过“解释”,边解释边执行。 另一种称为“编译”,它调用相应语言的编译程序,把源程序变成目标程序(以.OBJ为扩展名),然后再用连接程序,把目标程序与库文件相连接形成可执行文件。尽管编译的过程复杂一些,但它形成的可执行文件(以.exe为扩展名)可以反复执行,速度较快。运行程序时只要键入可执行程序的文件名,再按Enter键即可。 对源程序进行解释和编译任务的程序,分别叫作编译程序和解释程序。如FORTRAN、COBOL、PASCAL和C等高级语言,使用时需有相应的编译程序;BASIC、LISP等高级语言,使用时需用相应的解释程序。

常用DOS命令大全及其用法详解

求常用DOS命令大全及其用法!!! 浏览次数:63883次悬赏分:0 |解决时间:2009-5-21 13:38 |提问者:雪枫之哀伤 越详细的越好~~~ 拜托了!!! 最佳答案 既然自己不愿搜,我就帮你搜吧 一,ping 它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以确定目标主机的存在,可以初步判断目标主机的操作系统等。下面就来看看它的一些常用的操作。先看看帮助吧,在DOS窗口中键入:ping /? 回车,出现如图1。所示的帮助画面。在此,我们只掌握一些基本的很有用的参数就可以了(下同)。 -t 表示将不间断向目标IP发送数据包,直到我们强迫其停止。试想,如果你使用100M的宽带接入,而目标IP是56K的小猫,那么要不了多久,目标IP就因为承受不了这么多的数据而掉线,呵呵,一次攻击就这么简单的实现了。 -l 定义发送数据包的大小,默认为32字节,我们利用它可以最大定义到65500字节。结合上面介绍的-t参数一起使用,会有更好的效果哦。 -n 定义向目标IP发送数据包的次数,默认为3次。如果网络速度比较慢,3次对我们来说也浪费了不少时间,因为现在我们的目的仅仅是判断目标IP是否存在,那么就定义为一次吧。 说明一下,如果-t 参数和 -n参数一起使用,ping命令就以放在后面的参数为标准,比如“ping IP -t -n 3”,虽然使用了-t参数,但并不是一直ping下去,而是只ping 3次。另外,ping命令不一定非得ping IP,也可以直接ping 主机域名,这样就可以得到主机的IP。 下面我们举个例子来说明一下具体用法,如图2。 这里time=2表示从发出数据包到接受到返回数据包所用的时间是2秒,从这里可以判断网络连接速度的大小。从TTL的返回值可以初步判断被ping主机的操作系统,之所以说“初步判断”是因为这个值是可以修改的。这里TTL=32表示操作系统可能是win98。 (小知识:如果TTL=128,则表示目标主机可能是Win2000;如果TTL=250,则目标主机可能是Unix)

相关文档
相关文档 最新文档