1992年程序员级考试——下午试题

发表于:2007-05-26来源:作者:点击数: 标签:
1.本程序采用筛选法求质数。程序用一个无符号整数数组代表筛,它的每一位对应一个整数。因除2以外,其 余所有的质数都是奇数,约定数组按位的顺序,依次对应整数3,5,7,9,11。程序首先将数组所能容 纳的上述奇数放入筛中,即将数组的全部位置成1

1.本程序采用筛选法求质数。程序用一个无符号整数数组代表筛,它的每一位对应一个整数。因除2以外,其

余所有的质数都是奇数,约定数组按位的顺序,依次对应整数3,5,7,9,11。程序首先将数组所能容

纳的上述奇数放入筛中,即将数组的全部位置成1。从筛中找出最小的数,该数即为质数,然后将该质数的倍

数从筛中去掉,即将在数组中与它们对应的位置成0。因偶数不在筛中,去掉的数是找到的质数的1倍,3倍,

5倍……等整数。反复上述过程,直至筛为空。程序就能找到指定范围内的全部质数。

【程序】

 #include <stdio.h>

#define N 50

#define LN 16


main()

{

unsigned int sieve[N],primes[N];

unsigned int j,w,p,c;


for(j=0;j<N;j++)

{ sieve[j] =0xFFFFFFFF;

primes[j] =0x00;

}

w=0; j=0;

do { while (((0x01<< (j++)) & sieve[w]==0x00);

p=________;

c=________;

primes[w] |= (___________);

do

{ sieve[p/LN] &=(~(___________));

p+=c;

} while (p < N*LN-LN);

while ((sieve[w] == 0x00) && (w < N-1))

{ w++;

j=0;

}

} while (sieve[w]) ;


printf("%5d",2);

for(w=0;w<N;w++)

{ for(j=0;j<LN;j++)

if((0x01 << j) & primes[w])

printf("%5d",__________);

}

printf("\n");

}


 

 

2. 设有两整数向量 A, B 的比较矩阵M 可定义为:

┏ 1 a(j) > b(i),

m(i)(j) = ┃ -1 a(j) < b(i), (i,j=0,1,┄,n-1)

┗ 0 a(J) = b(I),

如图所示。

┌──┬───────────┐

│B\A│ 8 9 4 6 2 4│

├──┼───────────┤

│ 3 │ 1 1 1 1 -1 1│

│ 7 │ 1 1 -1 -1 -1 -1│

│ 7 │ 1 1 -1 -1 -1 -1│

│ 5 │ 1 1 -1 1 -1 -1│

│ 3 │ 1 1 1 1 -1 1│

│ 8 │ 0 1 -1 -1 -1 -1│

└──┴───────────┘

(1) 本程序对给定的比较矩阵 M,确定满足 a(k)=x 条件的 A, B的一个整数解。

(2) 本程序的解法是: 读入 M,k,x后

1.填充A,B, 令b(i)=x-m(i)(k), a(i)=x (i=0,1,┄,n-1)

2.检查 a(j) 与b(i)是否满足 m(i)(j)

.若满足检查下一个;

.否则向上调整相应元素,并按以下约定回朔检查: 当B的第i个元*

素调整时,则回朔到A的第一个元素; 当A的第j个元素调整时,则*

回朔到A的当前元素和B的第一个元素.

本程序对比较矩阵M的合理性未作检查,并假定在指定的条件下一定能找到一个解。


【程序】

#include <stdio.h>

#define MN 20

typedef int Vector[MN];

Vector Matrix[MN];

int N;


main(argc,argv)

int argc; char **argv;

{ Vector a,b;

int i,j,x,k;

void PrintVector();

void FillVector();

FILE *fp,*fopen();


if ((fp=fopen(argv[argc-1],"r")) == NULL)

{ printf("Cannot open file %s\n",argv[argc-1]);

exit(1);

}

fscanf(fp,"%d",&N);

for(i=0;i<N;i++)

for(j=0;j<N;j++)

fscanf(fp,"%d",&Matrix[j]);

fscanf(fp,"%d%d",&k,&x);

fclose(fp);

FillVector(a,b,k,x);

printf("The Vector A is:\n");

PrintVector(a);

printf("The vector B is:\n");

PrintVector(b);

}

void PrintVector(v)

Vector v;

{ int i;

printf("[");

for(i=0;i<N;i++)

printf("%5d",v);

printf("]\n");

}

void FillVector(a,b,k,x)

Vector a,b;

int k,x;

{ int i,j,temp;


for(i=0;i<N;i++)

{ b=x-Matrix[k];

a=x;

}

for(i=0;i<N;i++)

{ for(j=0;j<N;j++)

{ Temp=b+Matrix[j];

if (Matrix[j]==1 && Temp > a[j])

{ _________; i=0;}

else if(Matrix[j]==-1 && Temp < a[j])

{ b=a[j]+1; _________ ; }

else if( a[j]>b )

{ b=a[j] ; ________ ; }

else if( a[j] < b )

{ __________ ; __________ ; }

}

}

}


 

 

3. 本子程序利用递归法判别用链表表示的两个非递归链表是否相等.

程序中的非递归列表定义为:

(1) 无元素的空列表;

(2) 由元素序列组成的一个列表,其中的元素可以是一个字符,或者是满足本定*

义的一个列表.

这种列表的一个例子是:

  S

┌───┐ ┌─┬─┬─┐ ┌─┬─┬─┐

│ ├→┤0│a│ ├→┤1│││^│

└───┘ └─┴─┴─┘ └─┴┼┴─┘

┌─────┘

│ ┌─┬─┬─┐ ┌─┬─┬─┐

└→┤0│b│ ├→┤0│c│^│

└─┴─┴─┘ └─┴─┴─┘


列表S由两个元素组成,第一个元素是字符a (标志为0),第二个元素是另一个列*

表(标志为1),该元素又有两个元素组成(标志为0),分别为字符b和字符c.

在两个列表中,若它们的元素个数相等,且表中元素依次相同,则两个列表相等(*

子程序回答1),否则不相等(子程序回答0).


 【程序】

typedef struct lnode

{ int tag;

union

{ char data;

struct lnode *dlink;

} un;

struct lnode *link;

} listnode;

int equal(s,t)

listnode *s,*t;

{ int x,res;


if(s==t)

__________ ;

else if( _________ )

if( _________ )

{ if(!s->tag)

x= ___________ ;

else

x= ___________ ;

if(x) return (_________);

}

return(0);

}

原文转自:http://www.ltesting.net