导航:复试上机历年真题,题目未搜集全
十四:2003 十三:2004
十二:2005 十一:2006
十:2007 九:2008
八:2009 七:2012
六:2013 五:2014
四:2015 三:2017
二:2018 一:2019
四、2015
1、修水渠
题目:
修一条水渠,单独修,甲队需要 20 天完成,乙队需要 30 天完成。如果两队合作,由于彼此施工有影响,他们的工作效率就要降低,甲队的工作效率是原来的4/5,乙队的工作效率是原来的 9/10.现在计划 X 天修完这条水渠,且要求两队合作的天数最少,那么两队要合作几天?(要求:输入 X,正确输出合作天数)
当两队合作完成之后,由于保证尽快完成,接下来让甲队继续修
代码:
#include<stdio.h>
int main()
{
double x, y, z;
x = 1.0/20;
y = 1.0/30;
z = x*4.0/5 + y*9.0/10;
int n;
scanf("%d", &n);
for(int i=1;i<=n;i++)
{
if(z*i + (n-i)*x>=1.0)
//甲乙合作完了,剩下的由甲完成,因为甲的效率高,保证时间最短
{
printf("甲乙合作%d天
", i);
printf("合作干了%.2f,甲干剩下的%.2f,一共为%.2f
", z*i, (n-i)*x, z*i + (n-i)*x);
break;
}
}
return 0;
}
2、十六进制转换为十进制
题目:
输入一个十六进制的字符串,以
结束,输出其相应的十进制数。
十六进制下有的位为字符,如A表示10,B表示11;
代码:
#include<stdio.h>
#include<string.h>
int change(char ch)
{
int x=0;
if(ch<='9'&&ch>='0')
x = ch-'0';
else if(ch>='A'&&ch<='Z')
x = ch-'A'+10;
return x;
}
int SixthToTen(char str[], int len)
{
int sums=0, carry=1;
for(int i=len-1;i>=0;i--)
{
sums += change(str[i])*carry;
carry *= 16;
}
return sums;
}
int main()
{
char str[10];
gets(str);
int len=strlen(str);
int n = SixthToTen(str, len);
printf("%s转换为十进制为%d
", str, n);
return 0;
}
3、统计整数
题目:
从键盘读入 N 个整数,以 0 为结束,输出这些整数,整数的个数,并求出现次
数最多的整数,整数的大小从 1 到 100,N<100.
例如:输入:2 12 2 5;
输出:
2 2
12 1
5 1
2次数最多
代码:
#include<stdio.h>
int a[101]={0};
int main()
{
int x;
while(scanf("%d",&x)!=EOF&&x!=0)
{
a[x]++;
}
int k=-1, maxn=-1;
for(int i=1;i<=100;i++)
{
if(a[i]>maxn)
{
maxn = a[i];
k = i;
}
}
for(int i=1;i<=100;i++)
if(a[i]!=0)
printf("%d - %d个
", i, a[i]);
printf("出现最多%d-%d个
", k, maxn);
return 0;
}
4、单词匹配
题目:
假设有个词典库,内存的单词和其 ID 号如下所示。编程实现,输入一个单词(不区分大小写):
(1)如果该单词和库内的单词完全相同,则输出该单词的 ID号;
(2)如果该单词和词库中的某个词错了一个字母,则输出“单词错误,您是否想输入:”后跟正确的单词;
(3)其他情况输出,“库中没有该单词!”。
分析:
需要拿输入的单词与字典库中的逐个匹配,找到一个完全一致的则退出,否则需要全部比对。
这里应该有以下几种情况
- 如果单词长度相差2,则一定不正确
- 如果单词长度相差1
- 短串在长串中,如face与fac;
- 输入单词中缺少了一个字母,如face与fae;
- 错误单词超过两个,如face与fdd;
- 完全一致,直接匹配成功
- 单词长度相同
- 错误单词只有一个,如face与facc;
- 错误单词超过两个,如face与fadd;
代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
typedef struct words{
char id[10];
char word[10];
}words;
words w[8] = {
{ "1000", "face"}, { "1001", "head"},
{ "1002", "hand"}, { "1003", "nose"},
{ "1004", "ear"}, { "1005", "kneel"},
{ "1006", "finger"}, { "1007", "leg"},
};
int strMatch(char str1[], char str2[])//字符串匹配,成功为1,失败为0
{
int res=0, len1, len2;
len1 = strlen(str1);
len2 = strlen(str2);
int i, j, p;
p = 0;
i = p; j = 0;
while(i<len1&&j<len2)
{
if(str1[i]==str2[j])
{
i++;
j++;
}
else
{
p++;
i = p;
j = 0;
}
}
if(j>=len2)
res = 1;
return res;
}
int main()
{
char str[10], id[10];
int len;
while(gets(str)!=NULL)
{
len = strlen(str);
int wlen, flag, minn;
minn = len;
for(int i=0;i<8;i++)
{
if(strcmp(w[i].word, str)==0)//匹配成功,退出
{
flag = 0;//falg=0表示成功匹配
strcpy(id, w[i].id);
}
else
{
wlen = strlen(w[i].word);
if(abs(wlen-len)>=2)//长度相差2,肯定不成功,接着匹配下一个
{
flag = 2;
}
else if(abs(wlen-len)==1)//长度相差1
{
int res=0;
if(wlen>len)//短串是否在长串中,如果在res=1,不在res=0
res=strMatch(w[i].word, str);
else if(len>wlen)
res=strMatch(str, w[i].word);
if(res==1)//短串在长串中
flag=1;//如果找到一个只相差一个字母的单词,也还要继续匹配,可能完全相同的单词
else //如果长串中没有短串,但是其实匹配,如face与fae
{
flag = 0;
int k=0, j=0;
while(k<len&&j<wlen)
{
if(str[k]==w[i].word[j])
{
j++;
k++;
}
else if(str[k]!=w[i].word[j])
{
if(k+1<len&&str[k+1]==w[i].word[j])
k++;
else if(j+1<wlen&&str[k]==w[i].word[j+1])
j++;
flag++;
}
if(flag>1)
break;
}
}
}
else if(abs(wlen-len)==0)//长度相同,如face与facc
{
flag = 0;
int k=0,j=0;
while(k<len&&j<wlen)
{
if(str[k]!=w[i].word[j])
flag++;
if(flag>1)
break;
k++;
j++;
}
}
}
if(minn>flag)//每次找最少的查询结果
minn = flag;
if(minn==0)//如果匹配成功,直接退出
break;
}
if(minn>=2)
{
printf("库中没有该单词
");
break;
}
else if(minn==1)
printf("单词错误,您是否重新输入
");
else if(minn==0)
{
printf("匹配成功,单词ID为%s
", id);
break;
}
}
return 0;
}