zoukankan      html  css  js  c++  java
  • 上机练习四

    导航:复试上机历年真题,题目未搜集全
    十四: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;
    }
    
    
  • 相关阅读:
    Python replace()方法
    QQ传输协议分析
    子网与子网掩码的介绍
    每天撸点Linux
    对一次ARP欺骗分析
    中转注入
    第五篇学习笔记
    第四篇学习笔记
    第三篇学习笔记
    第二篇学习笔记
  • 原文地址:https://www.cnblogs.com/welan/p/12706529.html
Copyright © 2011-2022 走看看