Advertisement

东北大学计算机专业研究生入学考试2005年真题

阅读量:
复制代码
 /*-------------------------------------------------------C语言部分------------------------------------------------------------------*/

    
 /*1.将一个数的数码倒过来所得到的新数叫原数的反序数。如果一个数等于它的反序数,则称它为对称数。计算不超过1993的最大的二进制的对称数。*/
    
 #include <stdio.h>
    
 int count(int n)
    
 {
    
 	int a[4],i = 0,flag;  //flag为是否是对称数的标记,若为对称数为1,否则为0
    
 	while(n != 0)   //获取n的四位数字分别放到a数组中
    
 	{
    
 		a[i] = n % 10; //获取n的末位数字
    
 		n =  n / 10;   
    
 		i++;
    
 	} 
    
     if(i == 2)  //n为两位数的情况
    
 	{
    
 		if(a[0] == a[1])
    
 			flag = 1;
    
 		else
    
 			flag = 0;
    
 	}
    
 	else if(i == 3)   //n为三位数的情况
    
 	{
    
 		if(a[0] == a[2])
    
 			flag = 1;
    
 		else
    
 			flag = 0;
    
 	}
    
 	else   //n为四位数的情况
    
 	{
    
 		if(a[0] == a[3] && a[1] == a[2])     
    
 			flag = 1;
    
 		else
    
 			flag = 0;
    
 	}
    
 	return flag;
    
 }
    
 void main()
    
 {
    
 	int i,max = 0,flag;
    
 	for(i = 0;i < 1993;i++)
    
 	{ 
    
 		flag = count(i);
    
 		if(flag == 1 && i >= max)  //是对称数
    
 			max = i;
    
 	}
    
 	printf("%d",max);
    
 }
    
  
    
 /*2.编写一函数不清delstring(char *pstr1,char*pstr2)功能是删除在字符串pstr1中出现的所有字符串pstr2.(不允许有字符串标准库函数)*/
    
 void delstring(char *pstr1, char *pstr2)
    
 {
    
     int m = 0, n = 0, i = 0, j, v;
    
  
    
     while(pstr1[m]!= 0) m++; //m中统计pstr1的长度
    
     while(pstr2[n]!= 0) n++; //n中统计pstr2的长度
    
  
    
 	while ((m+1-i) > n)//pstr1剩余字符数要大于pstr2字符数
    
 	{   		
    
 		j = 0;
    
 		while (pstr1[i+j] == pstr2[j] && j<n)
    
 		{
    
 			j++;
    
 		}
    
 		
    
 		if (pstr2[j] == 0)
    
 		{
    
 			for(v = i+n; v <= m; v++)    //移动字符清除相同字符
    
 				pstr1[v-n] = pstr1[v];                       
    
 		}
    
 		else    //不同,继续.	
    
 			i++;   
    
 	}       
    
 }
    
  
    
 /*3.共有N种面值的邮票,存在整数R,使得用不超过M枚的上述面值的邮票可以贴出从1开始一直到R的有面值,但不能R+1。
    
 例如:面值(1,4,7,8)的邮票不超过3张可以贴出1~24间的所有邮资,但贴不出25。)
    
 请从键盘输入M和N,寻找一种确定每种邮票面值的方案,使得该方案在M和N的限制下对应的R值最大。*/
    
 #define MAX_N_SIZE 10
    
 int r,a[MAX_N_SIZE];/*-----r为最大面值,a[0..n-1]存放各种面值-----*/
    
 int fun(int m,int n)
    
 {
    
 	int i,flag = 0,m1;
    
 	m1 = m;
    
 	if(m1 > n)
    
 		printf("error");
    
 	if(m1 == n)
    
 		m1--;
    
 	for(i = 0;i < m1;i++)
    
 		a[i]=1+i*m1;
    
 	for(i = m1;i < n;i++)
    
 		a[i]=a[i-1]+1;
    
 	r = a[n-1]*m;
    
 } 
    
  
    
 /*--------------------------------------------------------数据结构部分---------------------------------------------------------------*/
    
 /*二.写出从哈希表中删除关键字为K的一个记录的算法,设哈希函数为H,解决冲突的方法为链地址法。*/
    
 //!!!!!!!!!!!!!!!!!!!此题与2004年数据结构部分第三大题的一部分
    
  
    
 /*三.设二叉树中结点的数据域的值互不相同,试设计一个算法将数据域值为X的结点的所有祖先结点的数据域打印出来。*/
    
 struct Record   //结点
    
 {                   
    
 	Record  *left;
    
 	Record  *right;
    
 	Record  *parent;
    
 	type     data;
    
 };
    
  
    
 void PrintParent(type x)
    
 {   
    
 	while(p != NULL && p->data != x) //查找值为X的节点;
    
 		p = p->next;
    
 	if(p->data == x)
    
 	{
    
 		for(p = parent; p != null; p = parent->parent)
    
 		    printf("%d",data);
    
 	}
    
 }
    
  
    
 /*四.写算法判别以邻接表方式存储的有向图中是否存在由顶点Vi到Vj的路径。(i不等于j)*/
    
 //邻接表结构
    
 struct arcnode
    
 {
    
 	int  post;
    
 	arcnode *next;
    
 };
    
  
    
 struct headnode
    
 {
    
 	type data;
    
 	arcnode *first;
    
 };
    
  
    
 struct graph
    
 {
    
 	headnode node[n];
    
 	int nodenum,arcnum;
    
 }g;
    
  
    
 bool visited[n];  //访问标志                       
    
  
    
 bool path(graph g, int  vi, int vj)
    
 {
    
 	arcnode w = g.node[vi].first;
    
 	visited[vi] = true;
    
 	
    
 	if(g.node[vi].data == g.node[vj].data)
    
 	    return true;
    
  
    
 	for(; w; w = w->next)     //深度遍历
    
 		if(!visited[w->post]) 
    
 			return path(g, w->post, vj);
    
 	return false;
    
 }

全部评论 (0)

还没有任何评论哟~