2018年华科计算机学院机试题

  1. 从键盘输入一行英文句子,句子中只有英文单词和空格,每个单词之间由若干个空格隔开,
    英文单词由大小写字母组成,编程完成下列任务:
    (1)统计并输出此句子中英文字母的个数; (10 分)
    (2)统计并输出此句子中单词的个数; (10 分)
    (3)查找此句子中出现次数最多的字母(不区分大小写,大小写字母是相同的)和次数。当出现最多的字符不止一个时,都能找到,并输出找到的所有字母及次数。(输出字母时大小写均可) (20 分)
    例如,输入句子:This is An Pencil Case
    则输出为:
    字母个数:18
    单词个数:5
    最多的字母:i,s
    出现的次数:3

解:统计个数在遍历中进行,统计单词也在遍历中进行,最后统计次数采用hash的思想进行。

#include<iostream>
#include<string> 
using namespace std;

int hash[26]={0};//hash数组统计单词出现次数

int main(){
	string str;
	getline(cin,str);
	int letter=0,word=0,num=0;
	for(int i=0;i<str.size();i++){
		int k=str[i]-'a',m=str[i]-'A';
		if((0<=k&&k<=26)||(0<=m&&m<=26)){
			if(i==0||str[i-1]==' '){ //判断是否是单词开始 
				letter++;
				word++;
			}
	       else letter++;
	       
	       if(0<=k&&k<=26){  //统计次数,更新最大次数 
		   hash[k]++;
		   if(num<hash[k])
		   num=hash[k];
		   }
	       else {
	       	 hash[m]++;
		   if(num<hash[m])
		   num=hash[m];
		   }
		}	
	}
	cout<<"字母个数:"<<letter<<endl;
	cout<<"单词个数:" <<word<<endl; 
	cout<<"最多的字母:"; 
	for(int i=0;i<26;i++)
	if(hash[i]==num){
	char c=i+'a' ;
	cout<<c<<" ";
        }
    cout<<endl;
    cout<<"出现的次数:"<<num<<endl; 
	return 0;
} 

运行结果
在这里插入图片描述

  1. 十二进制是数学中一种以 12 为底数的计数系统,它由 0~9,a,b 组成,与十进制的队友关系是:0~9 对应 0~9,a 对应 10,b 对应 11。例如,十二进制的 a2,十进制是 122。输入一个仅含十二进制数字的字符串(字母一律小写,不超过 8 个字符),完成下列任务:
    (1)输出该十二进制数每一位对应的十进制数(从高位到低位顺序输出,空格隔开);
    (2)实现“十二进制”转“十进制”算法,输出该十二进制数对应的十进制数;
    (3)输出转换后的十进制数在内存中的每个二进制位(共 4 字节,每字节之间空格隔开)。
    例如,输入十二进制数:a2
    则输出为:
    10 2
    122
    00000000 00000000 00000000 01111010

思路:前两个问题简单,最后一个问题可以建立起一个空间为32的数组存储10进制转换为2进制的数字。

using namespace std;

int num[8];//存储每个字符对应12进制大小
int a[33]={0};//存储二进制数

int main(){
	string str;
	getline(cin,str);
	for(int i=0;i<str.size();i++) //将字符转化为对应大小 
	{
		if(str[i]=='a')num[i]=10;
		else if(str[i]=='b')num[i]=11;
		else num[i]=str[i]-'0';
	}
	int sum=0;
	for(int i=0;i<str.size();i++){ //1,2 问 
		sum=sum*12+num[i];
		cout<<num[i]<<" ";
	}
	cout<<endl<<sum<<endl;
	int k;
	for(int i=32;sum>0;i--){ //二进制转化 
		a[i]=sum%2;
		sum=sum/2;
	}
	for(int i=1;i<=32;i++)
	{
		cout<<a[i] ;
		if(i%8==0)cout<<" ";
	} 
	cout<<endl;
	return 0; 
} 

运行结果:
在这里插入图片描述
在这里插入图片描述
题目如上所述。
这里复杂在小数部分的处理,如何处理判断循环节,我们需要手动模拟 除法求小数的过程。这里利用map来标记循环节出现的位置。

#include<iostream>
#include<map>
using namespace std;

int a[101];//用来储存小数部分 
map<int,int>b;// 用来标识循环节和起始位置 

void generatep(int n,int d)
{
	b.clear();
int k=n/d,tag=1;//保存整数部分
int mod=n%d;//小数部分 
int s=0,e;//记录循环节起始位置 
for(int i=0;mod;i++) 
{   
    
	mod=mod*10; 
	if(b[mod]){ //起始位置需要手动判断 因为key值不存在返回0 
	tag=0;
	s=b[mod];
	break;
	}
	if(mod/d==a[0]) {//判断循环节是否在开始位置
		s=0;
		tag=0;
		break;
	}
	
	a[i]=mod/d;
	b[mod]=i;
	mod=mod%d;
	e=i;
} 
if(!tag){
	cout<<k<<".";
	for(int i=0;i<s;i++)
	cout<<a[i];
	cout<<"(";
	for(int i=s;i<=e;i++)
	cout<<a[i];
	cout<<")"<<endl;
}
else {
	cout<<k<<".";
	for(int i=0;i<=e;i++)
	cout<<a[i];
	cout<<endl;
}
} 


int main(){
	
	int n,d;
	for(int i=0;i<3;i++)
	{
		scanf("%d/%d",&n,&d);
		generatep(n,d);
	}
	
}

在这里插入图片描述
这里指得注意的是map的返回值,在这里困了差不多半个小时。

发布了63 篇原创文章 · 获赞 6 · 访问量 2010

猜你喜欢

转载自blog.csdn.net/qq_36684096/article/details/104968166