下面的代码是自己写的,难免有纰漏之处,发现请指正,谢谢。
- 第一题
/**************************************************************************
* Problem: 北航2011上机题1
* Copyright 2011 by Yan
* DATE:
* E-Mail: yming0221@gmail.com
************************************************************************/
#include<stdio.h>
int tab[20001];/*存储每个数的因数之和*/
int main()
{
int m,n;
int i,j;
int flag;
for(i=1;i<20001;i++)
{
for(j=1;j<i;j++)
{
if(i%j==0) tab[i]+=j;
}
}
while(scanf("%d %d",&m,&n)!=EOF)
{
flag=0;
for(i=m;i<=n;i++)
{
for(j=m;j<i;j++)
{
if(tab[i]==j && tab[j]==i) printf("%d %d ",j,i),flag=1;
}
}
if(flag==1) printf("\n");
if(flag==0) printf("NONE\n");
}
return 0;
}
上面使用打表的方式,这样打表只计算一遍,如果是多重输入的话推荐这样,如果是单重输入,可以将打表放在输入后,减少打表时间复杂度。
- 第二题
/**************************************************************************
* Problem: 2011北航上机2题
* Copyright 2011 by Yan
* DATE:
* E-Mail: yming0221@gmail.com
************************************************************************/
#include<stdio.h>
#define MAX 21
#define MIN(a,b) (a)>(b)?(b):(a)
int value[MAX][MAX];
int sub[MAX][MAX];
int main()
{
freopen("input","r",stdin);
int m,n;/*原矩阵大小*/
int i,j;
int x,y;/*替换矩阵大小 x行、y列*/
int posx,posy;
int tmp1,tmp2;
while(scanf("%d %d",&m,&n)!=EOF)
{
for(i=0;i<m;i++)
for(j=0;j<n;j++) scanf("%d",&value[i][j]);
scanf("%d %d",&x,&y);
for(i=0;i<x;i++)
for(j=0;j<y;j++) scanf("%d",&sub[i][j]);
scanf("%d %d",&posx,&posy);
tmp1=MIN(posx+x,m);tmp2=MIN(posy+y,n);
for(i=posx-1;i<tmp1;i++)
for(j=posy-1;j<tmp2;j++)
value[i][j]=sub[i-posx+1][j-posy+1];
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%d ",value[i][j]);
printf("\n");
}
}
return 0;
}
- 第三题
/**************************************************************************
* Problem: 2011北航上机题3
* Copyright 2011 by Yan
* DATE:
* E-Mail: yming0221@gmail.com
************************************************************************/
#include<stdio.h>
char str[100];
int main()
{
freopen("input","r",stdin);
int i,j;
while(scanf("%s",str)!=EOF)
{
for(i=0;str[i]!='\0';i++)
{
if(str[i]=='-')
{
if(str[i-1]>='A' && str[i-1]<='Z' && str[i+1]>='A'
&& str[i+1]<='Z' && str[i+1]>str[i-1])/*大写字母扩展*/
{
for(j=str[i-1]+1;j<str[i+1];j++) printf("%c",j);
}
else if(str[i-1]>='a' && str[i-1]<='z' && str[i+1]>='a'
&& str[i+1]<='z' && str[i+1]>str[i-1])/*小写字母扩展*/
{
for(j=str[i-1]+1;j<str[i+1];j++) printf("%c",j);
}
else if(str[i-1]>='0' && str[i-1]<='9' && str[i+1]>='0'
&& str[i+1]<='9' && str[i+1]>str[i-1])/*数字扩展*/
{
for(j=str[i-1]+1;j<str[i+1];j++) printf("%c",j);
}
else printf("-");
}
else printf("%c",str[i]);/*不扩展*/
}
printf("\n");
}
return 0;
}
本文提供了2011年北航计算机复试上机考试三道题目的代码实现,包括求amicable numbers、矩阵局部替换及字符串扩展处理。通过打表优化时间和空间复杂度。

被折叠的 条评论
为什么被折叠?



