中大信科院计算机历年复试专业课真题 CCCC 语 v2.1v2.1v2.1v2.1
200320032003 年
2003
1.有关递归填空,题目略
2.最大公共子串程序填空.
int i,j,k,p;
int count = 0;
int* substr;
char * str1,str2;
int len1,len2;
if(len1 > len2)
{
len2=len1;
}
else
{
char * temp = str1;
str1 = str2;
str2 = temp;
}
for ( j = len2; j > 0; j-- )
{
for (k=0;
; k++ )
for ( i = 0;
{
; i++ )
; p++ ) ;
) count++;
for (p = 0;
{
if (
}
}
if ( count != 0 )
{
break;
}
}
*substr = (count != 0)?:0;
由于原来的代码完整性待考察,整理人员重写编写一个权当自己练习
传统暴力方法:
#include
#define maxSize 100
void LCS(char str1[],char str2[],char LCString[])
{
int i,j,m,n,maxLength,maxStart,count;
i = 0;
maxLength = 0;
while(str1[i]!='\0')
{
j = 0;
while(str2[j]!='\0')
{
m = i;
n = j++;
count = 0;
while((str1[m]!='\0')&&(str2[n]!='\0'))
{
if(str1[m]==str2[n])
{
count++;
m++;
n++;
}
else
{
}
break;
}
if(count > maxLength)
{
maxLength = count;
maxStart = i;
}
}
i++;
}
if(maxLength>0)
{
i = maxStart;
while(i<(maxLength+maxStart))
{
LCString[i-maxStart]=str1[i];
i++;
}
LCString[i-maxStart]='\0';
}
}
int main()
{
char str1[maxSize]="11234123456712345678";
char str2[maxSize]="12345678";
char LCString[maxSize];
LCS(str1,str2,LCString);
printf("%s",LCString);
scanf("%s",LCString);
return 0;
}
利用二维数组的方法可以参考 http://blog.csdn.net/chenwenshi/article/details/6027884
或者用 KMP 模式匹配
3.迷宫(深度优先搜索算法)以下参考
void visit(int, int);
int maze[9][9] = {{2, 2, 2, 2, 2, 2, 2, 2, 2},
{2, 0, 0, 0, 0, 0, 0, 0, 2},
{2, 0, 2, 2, 0, 2, 2, 0, 2},
{2, 0, 2, 0, 0, 2, 0, 0, 2},
{2, 0, 2, 0, 2, 0, 2, 0, 2},
{2, 0, 0, 0, 0, 0, 2, 0, 2},
{2, 2, 0, 2, 2, 0, 2, 2, 2},
{2, 0, 0, 0, 0, 0, 0, 0, 2},
{2, 2, 2, 2, 2, 2, 2, 2, 2}};
int startI = 1, startJ = 1;
int endI = 7, endJ = 7;
// 入口
// 出口
int main(void) {
int i, j;
printf("显示迷宫:\n");
for(i = 0; i < 9; i++) {
for(j = 0; j < 9; j++)
if(maze[i][j] == 2)
printf("█");
else
printf("
");
printf("\n");
}
visit(startI, startJ);
int qwer;
scanf("%d",&qwer);
return 0;
}
void visit(int i, int j) {
int m, n;
maze[i][j] = 1;
if(i == endI && j == endJ) {
printf("\n 显示路径:\n");
for(m = 0; m < 9; m++) {
for(n = 0; n < 9; n++)
if(maze[m][n] == 2)
printf("█");
else if(maze[m][n] == 1)
else
printf("◇");
printf("
");
printf("\n");
}
}
if(maze[i][j+1] == 0) visit(i, j+1);
if(maze[i+1][j] == 0) visit(i+1, j);
if(maze[i][j-1] == 0) visit(i, j-1);
if(maze[i-1][j] == 0) visit(i-1, j);
maze[i][j] = 0;
}
200420042004 年
2004
1.写出程序输出结果(资料不足,整理者难以整理出题目完整版,也不清楚这个 testNum 是求什么数的,知道的请联
系整理人员)
int testNum(int Number,int radius)
{
int maxPower,leftPower,rightPower,leftNum,rightNum;
leftPower = 1;
rightPower = radius;
while(Number/rightPower > radius)
{
leftPower *= radius;
}
while(leftPower>rightPower)
{
leftNum = (Number/leftPower)%radius;
rightNum = Number/radius;
if(leftNum!=rightNum)
{
return 0;
}
leftPower = leftPower/radius;
rightPower = rightPower*radius;
return 1;
}
}
void main()
{
int Number,result1,result2;
printf("the Number is :");
for(Number = 700; Number<=730; Number++)
{
result1 = testNum(Number,10);
result2 = testNum(Number,2);
if(result1&&result2)
{
printf("%d",Number);
}
}
}
2.程序填空。
完成的功能是把一个整数 W 分解成不多于 N 个整数的和,且这些整数只能取自数组 b[]
(程序实在想不起来了,只记得程序是用递归完成的,总 共有 5 个空,我认为不难)
若 b[]有序可参考
题目:输入一个正数 n,输出所有和为 n 连续正数序列。
例如输入 15,由于 1+2+3+4+5=4+5+6=7+8=15,所以输出 3 个连续序列 1-5、4-6 和 7-8。
算法,记 min,max 为序列的最值,初始化为 min=1,max=2,当 min+...+maxn 时,min 右移
3,编写一段函数,满足以下要求:将字符串 str 中出现的所有 subStr 都替换成 substitute,并且都不损害字符串 str,函
数原型为:
char* exchange(char str[],char subStr[],char substitute[])
以下代码仅供参考,若有更好的方法代码,请联系整理人员
#include
void replace(char str[],int begin,int &end,char substitute[]);
char* exchange(char str[],char subStr[],char substitute[])
{
int i,j,k,begin,end;
i = 0;
while(str[i]!='\0')
{
k = i;
j = 0;
while(subStr[j]!='\0')
{
if(str[k]==subStr[j])
{
k++;
j++;
break;
}
else
{
}
}
if(subStr[j]=='\0')
{
begin = k-j;
end = k-1;
replace(str,begin,end,substitute);
i = end+1;
}
else
{
}
i++;
}
return str;
}
void replace(char str[],int begin,int &end,char substitute[])
{
int lengthOfSub=0,lengthOfStr=0,index=0;
while(str[lengthOfStr]!='\0'&&substitute[lengthOfSub]!='\0')
{
lengthOfSub++;
lengthOfStr++;
}
while(str[lengthOfStr]!='\0')
{
lengthOfStr++;
}
if(lengthOfSub==(end-begin+1))
{
while(index
str[begin+index]=substitute[index];
index++;
}
}
else if(lengthOfSub>(end-begin+1))
{
int moveStep = lengthOfSub-(end-begin+1);
index = lengthOfStr-1;
while(index>end)
{
str[index+moveStep] = str[index];
index--;
}
index = 0;
while(index
char str[]="1000200030004000";
char sub[]="000";
char substitute[]="*";
printf("%s\n",str);
exchange(str,sub,substitute);
printf("%s",str);
scanf("%s",str);
return 0;
}
200520052005 年
2005
1.看程序写输出(程序代码不完整,答案略)
#define maxSize 100
int a[maxSize],r[maxSize];
foo(int n)
{
int i, k;
k=0;
r[0]=n;
do
{
if(r[k] == 0)
{
printf (“%d=%d, a[0], a[1] ) ;
for ( i = 2; i <= k; i++ )
printf (“%d ”, a ) ;
printf ( “\n” ) ;
while ( k > 0 && a[k] == 1 ) k-- ;
{
if ( k > 0 )
{
a[k]-- ;
r[k]++;
}
}
else
{
a[k+1] = a[k] < r[k] ? a[k] : r[k] ;
r[k+1] = r[k] - a[k+1] ;
k++ ;
}
}while (k > 0)
}